float *和vector <float> </float>之间的区别

时间:2014-05-20 07:12:53

标签: c++

之间有什么区别
    float* x = new float[SIZE];

    vector<float> x(SIZE);

虽然它们都在内存中占用SIZE整数空间,并且使用vector允许使用有用的辅助函数,如果我不需要使用向量函数,该怎么办呢。 从表现和记忆中明智地使用float*shared_ptr<float>代替vector<float>会更好吗?

7 个答案:

答案 0 :(得分:2)

当vector&lt;浮动&gt;超出范围,其记忆自动获得免费&#39; d。

当浮动*超出范围时,您最好将指针存储在某处,否则会导致内存泄漏。

请参阅RAII

答案 1 :(得分:1)

vector<float> x(SIZE);

这是一个浮点列表,其中可以在创建后追加或删除元素。它还可以自动化内存管理

float* x = new float[SIZE];

这是固定大小数组的C级手动分配。 C ++等价物是

std::array<float, SIZE> x;

如果您不需要动态数组,std::array通常符合您的需求。 (但请注意,std::array是C ++ 11的东西,旧编译器不支持。)

答案 2 :(得分:0)

vector提供了增长和缩小的可能性,而不是数组的情况。此外,可以使用成员函数读取vector的大小,这对于数组是不可能的。

答案 3 :(得分:0)

Vector是一个包装数组的类。 这有利有弊:

优点:

  • Vector会根据您存储在其中的值自动增长
  • Vector有边界检查,如果你的代码有问题,将会更加详细。
  • Vector有更多的方法和操作符来访问和修改你的元素,比如push_back()
  • 超出范围时会自动删除,您不必手动删除

缺点:

  • Vector通常会比数组稍慢,因为会增加一个额外的抽象级别
  • 编译器会发现优化代码更加困难

一般来说,如果你没有进行高性能计算,我会总是使用vector而不是数组。

答案 4 :(得分:0)

float* x = new float[SIZE];

这将分配一个SIZE数量的浮点元素数组,例如,如果SIZE为10,它将分配10个浮点数的数组,并且可以作为x [0],x [1],... x [ 9]。没有边界检查,即如果您访问超过9,则不会发生错误/异常。

vector<float> x(SIZE);

分配一个SIZE数量的float元素的向量,它也可以增大。例如,如果SIZE为10,它将分配10个浮点数的向量,并且可以作为x [0],x [1],... x [9]来访问。此外,可以使用其他矢量辅助函数。类似的成员函数vector :: at与此操作符函数具有相同的行为,除了对vector :: at进行绑定检查,并通过抛出out_of_range异常来通知请求的位置是否超出范围。 参考:http://www.cplusplus.com/reference/vector/vector/operator[]/

答案 5 :(得分:0)

  

如果我不需要使用向量函数该怎么办。

然后不要使用它们。向量提供了操作值序列的操作,因此如果需要原始指针,可能使用向量。

  

使用float *而不是vector会更好吗??

这取决于你要解决的问题;通常,您会发现管理一系列值时遇到的问题往往与范围相似,并且使用矢量来处理它们,这比每次重新发明轮子要好得多(而且可能做得不好)。

在实践中,我发现了一个禁止使用矢量的单个项目,这是一个性能关键的服务器系统(已经开发,分析和优化了十多年)。除非您正在编写性能关键型软件,否则您可能希望使用向量。就此而言,如果您正在编写这种软件,您可能也想使用矢量。

  

使用float *而不是vector会更好吗??

基本上,如果你需要问,请使用矢量:)

使用float *会不会更好。向量解决了大量的重新解决问题,你通常不会考虑(并且不想,也不应该)。

其中包括异常安全实现,缓冲区溢出,内存泄漏等。

答案 6 :(得分:0)

嗯,float*是一个buitin,而std::vector<float>是一个用于保存多个对象的类。 float*是指向float类型的对象的指针。这就是为什么你可以用new指定一个浮点数组的指针,以便指针指向新数组的第一个元素。另一个区别是你需要delete[]一个用new[]分配的数组,而vector<float>被动态分配/调整大小并由它的析构函数释放。