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

C++ 如何为std::vector/std::string保留空间?,c++,vector,C++,Vector,我正在寻找一种方法来防止std::vectors/std::strings在给定的大小范围内增长(假设一个字符串可以容纳64个字符,但如果需要,它可以增长)。实现这一点的最佳方法是什么?查看.reserve()成员函数。说 [4] Reserve()导致手动重新分配。主要原因是 使用reserve()是效率:如果您知道您的 向量最终必须增长,然后它通常更有效地 一次分配所有内存,而不是依赖自动 再分配计划。使用reserve()的另一个原因是 您可以控制迭代器的失效。[5] [5] 向量的迭代器

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

查看
.reserve()
成员函数。说

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

[5] 向量的迭代器在内存不足时失效 重新分配。此外,在中插入或删除元素 向量的中间部分使指向元素的所有迭代器无效 在插入点或删除点之后。因此,你可以 防止向量的迭代器在使用 reserve()预先分配向量将使用的内存, 如果所有的插入和删除都在向量的末尾


这就是说,作为一般规则,除非您真的知道将要发生什么,否则最好让STL容器自己处理分配。

您通过
reserve(size\u type capacity)
成员函数为
vector
string
保留空间。但这并不能阻止它做任何事情:)。您只是告诉它分配至少那么多未初始化的内存(即,不会调用您类型的构造函数),并在需要时调整到更多

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
}
std::vector v;
v、 储备(100)//没有调用MyClass的构造函数
对于(int i=0;i<100;++i)
{
v、 向后推(MyClass());//不会发生重新分配。向量中有足够的空间
}
对于矢量:

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

<你的C++标准库引用到哪里?

< p>它们都有成员函数,叫做“代码>保留< /代码>,你可以用它来保留空间。

c.reserve(100); //where c is vector (or string)

我并不是说C++标准中的“标准”,我的意思是标准是STL的标准文档——这就是我们已经进行了十年的地方。你对“ALL”的定义已经被打破了。那么你要去哪里做在线STL文档呢?谷歌总是回到那个非常SGI网站,如果你查询例如“stl向量大小”。但我相信你有一个比我更好的搜索引擎。谷歌不是C++术语的专家,如果你搜索“STL”引用,那么你就可以得到“STL”引用。对于C++标准库文档,我建议“C++向量调整大小”,但是上面的结果有点垃圾。取而代之的是,从中获得一个好的参考。有句谚语说:“如果你在一个洞里,停止挖掘。”我认为你的问题是向量实际上是一个STL对象,而不是一个标准的库对象,因此在我最初的回答中是SGI参考。例如,维基百科文章的“C++向量”的开头:“vector是C++标准模板库中的类模板,它的功能类似于动态数组……”OK?
c.reserve(100); //where c is vector (or string)