容量是否被复制到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
表示包含T
types对象的容器类,a
和b
表示typesX
值,u
表示标识符,r
表示typesX
的非常量值,rv
表示typesX
的非常量值。
X u(a)
X u = a;
需要:
T
是CopyInsertable
到X
(见下文)。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
的大小; 虽然这不能保证。