C ++如何在复制时保留字符串容量

C++ How to preserve string capacity when copying

EDIT(原始 post 在编辑历史中)

我可以用这个例子重现我的问题:

#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 中的字符串并克隆。 他们的容量不一样!

是的,字符串class有一个成员函数 String resize member funtion..

myString.resize(l) 不会改变字符串的容量,除非 l 大于字符串的大小。只需致电 myString.capacity() 并亲自查看。

复制std::string时不要求复制容量相同

$21.3.1.2/2 basic_string 构造函数和赋值运算符 [string.cons]:

Table 49 — basic_string(const basic_string&) effects
Element   Value
data()    points at the first element of an allocated copy of the array whose first element is pointed at by str.data()
size()    str.size()
capacity()    a value at least as large as size()

唯一的保证是字符串的容量至少与其复制后的大小一样大。

这意味着你必须自己做:

for (int i = myVec.size(); i--;) {
    myVec[i].reserve(myVec[i].size() + MAX_BUFFER);
    clone.push_back(myVec[i]);
    clone.back().reserve(myVec[i].capacity());
}