在STL容器中如何转移所有权?

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

使用splice函数可以实现列表的操作。同样,对于整个向量来说,这也是可能在常数时间内实现的。

如果不能实现,那么为什么呢?


2
附注:已经提到了“swap”。但是我想补充一下,在C++0x中,您可以将“OvertakeContents”替换为“std::move”,它会做你想要的事情。 - sellibitze
3个回答

10

1
你的注释完全是错误的:所有的STL容器都提供了std::swap(a,b)的等效重载,其语义与a.swap(b)相同。 - Greg Rogers
@Greg。感谢您指出我笔记中的错误。在查看Vector.swap的参考资料后,它们确实具有相同的语义。 - RC.

10

std::vector有一个swap()函数,它的工作方式基本上像这样。

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

我差点给你点赞,但是你的代码语法有误。 - avakar

0

这里有两个要点:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接