C++:使用std :: vectors是否安全,好像它们是数组一样?

peo*_*oro 10 c++ arrays containers stl vector

我需要一个固定大小的元素数组,并调用它们需要知道它们如何放在内存中的函数,特别是:

  • 这些函数glVertexPointer需要知道顶点的位置,它们彼此之间的距离等等.在我的例子中,顶点将是要存储的元素的成员.

  • 为了得到这个数组中元素的索引,我宁愿避免index在我的元素中有一个字段,而是宁愿使用指针算术(即:Element *x将要的索引x - & array[0]) - 顺便说一句,这对我来说听起来很脏:是这是一种很好的做法还是我应该做些什么?


使用它是否安全std::vector

有些东西让我觉得std::array更合适但是:

  • 我的结构的构造函数和析构函数很少被调用:我不介意这样的开销.

  • 我将把std::vector容量设置为我需要的大小(用于a的大小std::array,因此不会因为零星的重新分配而产生任何开销.

  • 我不介意std::vector内部结构的空间开销.

  • 我可以使用调整向量的大小(或更好:在安装过程中选择一个大小),我认为没有办法用std :: array做这个,因为它的大小是一个模板参数(这太糟糕了:我即使使用旧的类似C的数组,只需在堆上动态分配它就可以做到这一点.


如果std::vector对我的目的没问题,我想了解详细信息,如果它将有一些运行时开销std::array(或一个普通的C数组):

我知道一旦我增加它的大小,它将调用任何元素的默认构造函数(但我想如果我的数据有一个空的默认构造函数,这将不会花费任何费用?),对于析构函数也是如此.还要别的吗?

vil*_*pam 5

保证向量具有连续内存中的所有元素,因此在您的场景中使用它是安全的.与c风格的数组相比,可能会有很小的性能损失,例如由于矢量实现完成的索引验证.在大多数情况下,性能是由其他东西决定的,所以我不担心,直到实际的性能测量表明这是一个真正的问题.

正如其他人所指出的那样,如果使用指向元素(或迭代器)的指针来访问它,请确保在使用存储在其中的数据时不重新分配向量.

  • @marcog:嗯,C++ 03标准呢.C++ 98没有,但它仍然是_always_案例,请参阅http://herbsutter.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/进行讨论就此而言. (7认同)