在STL容器内转让所有权?

时间:2009-09-23 13:23:15

标签: c++ stl ownership

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

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

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

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

3 个答案:

答案 0 :(得分:10)

查看std :: swap

vector<T> v1; 
// fill v1

vector<T> v2;

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

Swap Reference

答案 1 :(得分:10)

std :: vector有一个swap()函数,它的工作方式非常类似。

vector<T> v2;
v2.swap(v1);

答案 2 :(得分:0)

这里有两点:

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

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