C++向量内存分配

8
我想创建一个表示某种结构的元素向量。
问题是我不知道这个结构会有多少元素,因为数字会经常变化,而且我也不知道如何创建向量。
如何实现呢?
为了更清晰地说明:
我看到创建向量时,你可以这样做:
std::vector<structureType> vectorName(nrOfElements);

我不知道在括号中应该写多少个元素以及写什么内容。


1
std::vector 的整个意义在于你不需要知道大小。完全跳过括号,然后使用 myVector.push_back(); 向向量添加元素。它会根据需要自动扩展其内部存储器。你可以使用 myVector.size(); 获取当前大小。 - BoBTFish
1
可能是为向量分配内存的重复问题。 - user195488
3个回答

14

如果您使用默认构造函数创建向量,则会得到一个空向量:

std::vector<structureType> vectorName; // holds 0 elements

然后,您可以将元素推入向量中,以增加其大小(还请参阅其他向量修改器):

vectorName.push_back(someStructureTypeInstance);

这可能符合您的需求。如果您担心未来的内存重新分配,您可以在构建向量后使用std::vector::reserve

std::vector<structureType> vectorName; // holds 0 elements
vectorName.reserve(100); // still 0 elements, but capacity for 100

如果按照您的建议保留空间,那么如果我为101个元素预留空间,然后再添加第102个元素会发生什么?此外,在我的程序中,我会动态地分配一些内存。如果我选择像这样声明向量:std::vector<structureType> vectorName; ,然后只需向其中添加元素,是否有可能重叠手动分配的内存? - user2399378
4
当你插入第102个元素时,向量就必须分配一个新的内存块,这个内存块要足够大以容纳102个元素(通常它会分配大约是所需大小的2倍左右),然后将所有原先101个元素从原来的内存块中复制或移动到新的内存块中,最后释放原内存块。这些就是我所说的重新分配。你不必担心内存管理,但重新分配可能代价高昂,因此如果你知道向量的大小,可以通过保留正确的数量来避免它们。 - juanchopanza

1

我不知道在括号里写什么

什么也不写)) 在这种情况下,您将创建一个空向量,可以使用std::vector::push_back()进行增长

更新:不要忘记删除空的()以避免vexing parse


1
如果你在括号之间什么都不写,那么你就会遇到最棘手的解析错误(https://ideone.com/B5sBce)。可以省略括号(或者使用花括号{}统一初始化语法,如果你正在使用c++11)。 - BoBTFish
1
实际上,你应该像这样声明一个函数。所以你需要省略 (),或者如果你是 C++11,使用 {} - juanchopanza
@BoBTFish 是的,我知道 vexing parse 的问题。而且,是的,我忘了说要省略 ()。谢谢你的评论。我会进行更新。 - borisbn

1
你可以通过插入和/或删除元素来更改向量包含的元素数量。你需要特别查找向量的方法insertpush_back/emplace_backresizepop_backerase。你可以在任何C++参考资料中找到这些方法的描述(例如,在“Modifiers”部分这里查看),也可以在你选择的C++初学者书籍中找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接