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

C++ How to preserve string capacity when copying

本文关键字:保留 保留字 字符串 容量 复制 C++      更新时间:2023-10-16

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;
}

返回0之前添加断点。现在,检查myVec和clone中的字符串他们的能力不一样

在复制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());
}
是的,字符串类有一个成员函数字符串调整成员大小函数。。

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