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