【问题标题】:Capacity and copying in STL [duplicate]STL中的容量和复制[重复]
【发布时间】:2019-07-11 17:18:25
【问题描述】:

我想知道当您复制容器时,像向量或字符串这样的容器的容量会发生什么变化。我运行了以下实验(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 之后得到的东西”) ,尽管我认为标准会将其留给编译器。

【问题讨论】:

  • 您如何解释引用计数对象?那里也没有复制,但是“复制”了。
  • @PaulMcKenzie 我不明白你的意思。在任何情况下,例如shared_ptr 具有非常明确的复制语义(共享指针本身被复制,存在引用计数器等),这里我不确定在哪里指定应该或不应该将容量复制到新对象。

标签: c++ stl copy-constructor


【解决方案1】:

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

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

【讨论】:

  • 正确,但不是 any 值至少与size 一样大。例如。如果您调用reserve,则条件为capacity 的值。无论如何,根据该描述,我可以预期副本会返回相同的值。
  • @jdehesa 我不明白你所说的“正确,但不是任何值至少与 size 一样大”容量和 size 使用相同类型 size_type 的意思。
  • @jdehesa 容量根本不被视为容器价值的一部分。如果两个容器范围内的元素相等,则两个容器相等,这不需要容量相等(大多数容器没有容量)。你希望一个包含{1, 2, 3} 的向量等于另一个包含{1, 2, 3} 的相同类型的向量,即使一个向量的容量大于另一个向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 2016-01-17
  • 2013-01-22
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多