容量是否被复制到vector中?

采取以下代码:

std::vector<int> a; a.reserve(65536); std::vector<int> b(a); //NOTE: b is constructed from a a.reserve(65536); // no reallocation b.reserve(65536); 

容量是否被复制? 最后一行是否会重新分配? 这个标准是否对此有任何说明还是保持沉默?

容量是否被复制?

在实践中,没有。 我在Clang和GCC以及MSVC在线testing了它,并没有一个能够复制这个容量。

最后一行是否会重新分配?

如果容量小于保留的参数(即不被复制),那么是的。

这个标准是否对此有任何说明还是保持沉默?

vector.cons中没有提供复制构造函数的定义。 相反,我们必须看看container.requirements

X表示包含Ttypes对象的容器类, ab表示typesX值, u表示标识符, r表示typesX的非常量值, rv表示typesX的非常量值。

X u(a)

X u = a;

需要: TCopyInsertableX (见下文)。

post: u == a

现在两个容器相等是什么意思?

a == b

==是等价关系。 equal(a.begin(), a.end(), b.begin(), b.end())

换句话说,由于在比较中不需要相等的capacity ,所以没有理由复制capacity

不,容量不能保证通过vector拷贝构造来保存。

你可以这样做,如下所示:

 vector<int> b; b.reserve( a.capacity() ); b = a; 

更好地封装在一个函数中。

当你调用拷贝构造函数时,Standard没有提到保留容量的问题。 所以你对此没有任何保证。

但是,如果只需要保留副本中的容量,则可以执行以下技巧:交换a和b的状态:

  std::vector<int> a; a.reserve(65536); std::vector<int> b(a); b.swap(a); // now b has a's state assert(b.capacity() == 65536); 

那么,像下面这样的一个简单的检查就会发现容量不会被复制:

 std::vector<int> a; a.reserve(65536); cout << "a.capacity is " << a.capacity() << endl; // prints 65536 std::vector<int> b(a); //NOTE: b is constructed from a cout << "b.capacity is " << b.capacity() << endl; // prints 0 

我相信在将向量a复制到b ,在大多数编译器中b的容量被设置为b的大小; 虽然这不能保证。