我想知道复制时容器(如矢量或字符串)的容量会发生什么情况。我进行了以下实验(Clang 8),但不知道到底会发生什么。
#include <iostream>
#include <vector>
#include <string>
int main()
{
using namespace std;
vector<int> v;
v.reserve(100);
vector<int> v2 = v;
cout << v2.capacity() << endl;
// 0
string s;
s.reserve(100);
string s2 = s;
cout << s2.capacity() << endl;
// 15
return 0;
}
因此,似乎未复制容量。一方面,这似乎是合理的,因为使副本占用不必要的内存会很浪费。但是,另一方面,我可能希望这些副本具有相同的容量。也许我确实想制作一些具有一定预分配容量的向量。更一般地说,我通常希望副本的行为与被复制的对象相似,粗略地讲,在调用const
方法时返回相同的结果。我知道没有这样的规则,并且在标准中肯定有很多情况不会发生这种情况。但是无论如何,如果标准明确指出不需要跨副本维护容器的容量,那么我想知道是否有任何规范。理想情况下,我希望得到一些特定的行为,例如假设clang所做的事情是正确的(不保持容量),那么我想当然认为永远都不会保持容量(例如,诸如“副本的容量就是您在shrink_to_fit
之后会得到的容量) ”,尽管我认为该标准将由编译器决定。
答案 0 :(得分:0)
它是实现定义的。根据c ++ 17标准(对于std :: basic_string,24.3.2.2 basic_string构造函数和赋值运算符)
capacity() a value at least as large as size()