如何为std :: vector / std :: string保留空间?

时间:2011-07-16 18:56:00

标签: c++ vector

我正在寻找一种方法来阻止std :: vectors / std :: strings在给定的大小范围内增长(假设我想假设一个字符串将包含大约64个字符,但是如果需要它可以增长)。实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

查看.reserve()成员函数。 standard docs at the SGI site

  

[4] Reserve()会手动重新分配。主要原因   使用reserve()是效率:如果你知道你的容量   矢量必须最终成长,然后它通常更有效   一次分配该内存而不是依赖于自动   重新分配计划。使用reserve()的另一个原因是这样的   您可以控制迭代器的失效。 [5]

     

[5]向量的迭代器在其内存为空时失效   重新分配。此外,插入或删除中的元素   向量的中间使所有指向元素的迭代器无效   在插入或删除点之后。你可以这样做   如果使用,阻止向量的迭代器失效   reserve()预分配与向量一样多的内存,   如果所有插入和删除都在向量的末尾。

那就是说,作为一般规则,除非你真的知道会发生什么,最好让STL容器处理分配本身。

答案 1 :(得分:2)

您可以通过vector成员函数为stringreserve(size_type capacity)预留空间。但它并没有阻止任何事情:)。你只是告诉它至少分配那么多未初始化的内存(也就是说,不会调用你的类型的构造函数),并在需要时调整大小。

std::vector<MyClass> v;
v.reserve(100); //no constructor of MyClass is called
for(int i = 0; i < 100; ++i)
{
    v.push_back(MyClass()); // no reallocation will happen. There is enough space in the vector
}

答案 2 :(得分:2)

对于vector:

std::vector<char> v;
v.reserve(64);

对于字符串:

std::string s;
s.reserve(64);

您的C ++标准库参考在哪里?

答案 3 :(得分:0)

它们都有名为reserve的成员函数,可用于保留空间。

c.reserve(100); //where c is vector (or string)
相关问题