【发布时间】:2016-08-05 07:54:27
【问题描述】:
EDIT(编辑历史中的原始帖子)
我可以用这个例子重现我的问题:
#include <string>
#include <vector>
using namespace std;
#define MAX_BUFFER 30
int main(int argc, char **argv) {
vector<string> myVec = { "hey","asd","haha" };
vector<string> clone;
for (int i = myVec.size(); i--;) {
myVec[i].reserve(myVec[i].size() + MAX_BUFFER);
clone.push_back(myVec[i]);
}
return 0;
}
在 return 0; 之前添加一个断点。现在,检查 myVec 中的字符串并进行克隆。 他们的能力不一样!
【问题讨论】:
-
你说的“预留空间不留”是什么意思,是什么让你这么想的?
-
我编辑了这个例子,结果证明这不是问题(我的代码有点大)。但是现在,如果您运行第二个代码,您可以看到容量确实减少了。
-
@anon_user 不要试图在 C++ 中做 C。如果要将
buffer附加到std::string,请使用myString.append(buffer, bufferLen),std::string将根据需要自动调整大小。 -
@Holt,我怀疑地球上是否有编译器能够优化它。我很可能会使用具有 size_t 长度和灵活的字符数组的结构。
-
@anon_user 你会感到惊讶。如果要添加大量元素并且知道要添加多少元素,则在 C++ 中保留容量很有用,因此您不想进行大量小的重新分配,而只想进行大的重新分配。如果您只打算追加一个缓冲区,那么您只需要一次重新分配,无论您是在
.append之前使用.reserve还是让编译器在append中执行它都无关紧要。
标签: c++ string insert resize capacity