STL中的容量和复制

时间:2019-07-11 17:18:25

标签: c++ stl copy-constructor

我想知道复制时容器(如矢量或字符串)的容量会发生什么情况。我进行了以下实验(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之后会得到的容量) ”,尽管我认为该标准将由编译器决定。

1 个答案:

答案 0 :(得分:0)

它是实现定义的。根据c ++ 17标准(对于std :: basic_string,24.3.2.2 basic_string构造函数和赋值运算符)

capacity() a value at least as large as size()