2013-05-30 122 views
5

我想创建一个代表某个结构的元素向量。向量C++内存分配

问题是我不知道这个结构会有多少元素,因为这个数字会经常改变,而且我也不知道如何创建一个向量。

如何做到这一点?

为了更清楚:

我看到创建载体的情况下,你做这样的事情:

std::vector<structureType> vectorName(nrOfElements); 

我不知道元素的数量和写什么那里,括号之间。

+1

'std :: vector'的全部问题是你不需要知道大小。只需完全跳过括号,然后使用['myVector.push_back();'](http://en.cppreference.com/w/cpp/container/vector/push_back)添加到向量中。它会根据需要自动扩展内部存储器。您可以通过['myVector.size();'](http://en.cppreference.com/w/cpp/container/vector/size)获取当前大小。 – BoBTFish

+1

[Allocate memory for a vector]的可能副本(http://stackoverflow.com/questions/4427738/allocate-memory-for-a-vector) – 2013-05-30 13:37:41

回答

12

如果默认构建其载体,你会得到一个空:

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

,那么你可以把内容到载体,增加其大小(也看其他vector modifiers):

vectorName.push_back(someStructureTypeInstance); 

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

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

如果我按照你的建议做了menaing预留空间,如果发生了什么例如我保留101个元素的空间,然后添加第102个元素?另外,在我的程序中,我动态地分配了一些内存。如果我选择像这样声明向量:std :: vector vectorName; ,然后只是添加元素,有没有可能重叠手动分配的内存? – user2399378

+4

@ user2399378当你插入第102个元素时会发生什么,该向量必须分配一个足够大的102个元素的内存块(通常它分配大约2倍所需的大小),然后复制或移动它的所有元素原始的101大小的内存块到新的内存块,然后取消分配原始内存。这些是我正在谈论的重新分配。您不必担心内存管理,但重新分配可能会很昂贵,所以如果您知道向量的大小,您可以通过预留适量来避免它们。 – juanchopanza

1

我不知道该怎么括号内写有

写什么))在这种情况下,您将创建一个空的载体,可以至极与std::vector::push_back()

生长

更新:不要忘了删除空()避免vexing parse

+1

[如果你在括号之间没有写任何东西,你会发现最令人头疼的解析](https://ideone.com/B5sBce)。如果您正在使用'C++ 11',则完全忽略括号(或使用大括号'{}'统一初始化语法)。 – BoBTFish

+1

其实,你会声明一个这样的函数。所以你也需要省略'()',或者如果你有C++ 11,就使用'{}'。 – juanchopanza

+0

@BoBTFish是的,我知道关于令人烦恼的解析。是的,我忘了说忽略'()'。感谢您的评论。我会更新。 – borisbn

1

您可以更改元素的数量矢量包含,通过插入和/或删除元素。您正在寻找载体的方法insert,push_back/emplace_back, resize,pop_back,erase

你会发现在任何C++参考方法(例如有“调节器”部分中一看here),并在您选择的C++入门书描述。