STL 中的容量和复制 [duplicate]

Capacity and copying in STL [duplicate]

提问人:jdehesa 提问时间:7/12/2019 更新时间:7/12/2019 访问量:66

问:

我想知道当你复制它时,像向量或字符串这样的容器的容量会发生什么。我运行了以下实验(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;
}

所以看起来容量没有被复制。一方面,这似乎是合理的,因为让副本占用的内存超过必要的内存是浪费的。但是,另一方面,我可能期望副本具有相同的容量。也许我确实想制作几个具有一些预分配容量的向量。更一般地说,我通常希望副本的行为与复制的对象类似,粗略地说,在调用方法时返回相同的结果。我知道没有这样的规则,而且标准中肯定有很多情况不会发生这种情况。但无论如何,我想知道是否有任何关于它的规范,如果标准明确规定容器的容量不需要跨副本维护。理想情况下,我想得到一些特定的行为,例如,假设 clang 所做的是正确的(而不是保持容量),那么我想理所当然地认为容量永远不会被维护(例如,像“副本的容量是你会得到的”),尽管我认为标准会把它留给编译器。constshrink_to_fit

C++ STL 复制构造函数

评论

0赞 PaulMcKenzie 7/12/2019
您如何解释引用计数对象?那里也没有复制,但制作了“复制”。
0赞 jdehesa 7/12/2019
@PaulMcKenzie 我不明白你的意思。无论如何,例如 具有非常明确的复制语义(共享指针本身被复制,有引用计数器等),这里我不确定在哪里指定了应该或不应该将容量复制到新对象。shared_ptr

答:

0赞 Vlad from Moscow 7/12/2019 #1

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

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

评论

0赞 jdehesa 7/12/2019
对,但不是任何至少与 .例如,如果调用 ,则以 的值为条件。无论如何,从该描述中,我可以预期副本将返回相同的值。sizereservecapacity
1赞 Vlad from Moscow 7/12/2019
@jdehesa 我不明白你说“对,但不是任何至少与大小一样大的值”是什么意思,容量和大小使用相同的类型size_type。
1赞 François Andrieux 7/12/2019
@jdehesa容量根本不被视为容器价值的一部分。如果两个容器范围内的元素相等,则两个容器相等,并且这不需要容量相等(大多数容器没有容量)。您希望一个向量 contain 等于另一个相同类型的向量,即使一个向量的容量大于另一个。{1, 2, 3}{1, 2, 3}