C++如何在复制时保留字符串容量
C++ How to preserve string capacity when copying
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()
,亲自查看即可。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 为多个会话保留XPtr
- 保留对其他类的成员函数的引用
- 指针保留字符串
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何让 GCC/Clang 在保留标识符上出错
- 必须为 C++20 协程帧保留多少内存?
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 局部变量保留函数中的值
- 保留函数指针模板参数
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 更改保留指向其字段的原始指针的对象地址
- 外部"C"不允许 C 标头使用C++保留字
- 解析标识符,但排除 BOOST 精神中的保留字
- C++:为智能指针的字段隐式保留右值引用
- 设备控制块(DCB)中的fDummy2字段是为什么保留的
- 删除第一次循环时未调用析构函数的保留字
- qmake 语言保留字问题(我认为)
- 标记器点分开,但也保留空字段