5

是否可以将向量内容的所有权从一个向量转移到另一个向量?

vector<T> v1; 
// fill v1
vector<T> v2 = OvertakeContents(v1);
// now v1 would be empty and v2 would have all the contents of v1

具有拼接功能的列表是可能的。对于整个向量,这在恒定时间内也应该是可能的。

如果不是,那为什么不呢?

4

3 回答 3

10

查看 std::swap

vector<T> v1; 
// fill v1

vector<T> v2;

swap(v1, v2);
OR
v2.swap(v1);

交换参考

于 2009-09-23T13:25:42.333 回答
10

std::vector 有一个类似这样的 swap() 函数。

vector<T> v2;
v2.swap(v1);
于 2009-09-23T13:26:50.227 回答
0

这里有两点:

1) 对于任何 Assignable 类型,swap 都可以用赋值来定义。这需要三个分配,对于容器类型,每个分配都与容器的大小成线性关系。从某种意义上说,a.swap(b) 是多余的。它的存在只是为了效率:对于许多容器,例如vector和list,可以实现swap,使其运行时复杂度是恒定的而不是线性的。如果这对于某些容器类型 X 是可能的,那么模板特化 swap(X&, X&) 可以简单地写成 X::swap(X&)。这意味着 X::swap(X&) 只有在存在这样的常量时间实现时才应该定义。不是每个容器类 X 都需要有这样的成员函数,但如果成员函数存在,那么它保证是摊销常数时间。

2) 如果您需要另一个容器,该容器具有您想要转移所有权的相同元素请创建一个简单的副本以提高效率

于 2009-09-23T15:08:38.143 回答