是否可能将一个向量的所有权从一个向量转移到另一个向量?
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函数可以实现列表的操作。同样,对于整个向量来说,这也是可能在常数时间内实现的。
如果不能实现,那么为什么呢?
是否可能将一个向量的所有权从一个向量转移到另一个向量?
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函数可以实现列表的操作。同样,对于整个向量来说,这也是可能在常数时间内实现的。
如果不能实现,那么为什么呢?
std::vector有一个swap()函数,它的工作方式基本上像这样。
vector<T> v2;
v2.swap(v1);
这里有两个要点:
1)对于任何可分配类型,可以通过赋值来定义交换。这需要三个赋值操作,每个容器类型的赋值操作都是与容器大小成线性关系的。从某种意义上说,a.swap(b) 是多余的。它仅存在于效率的考虑:对于许多容器(例如 vector 和 list),可以实现 swap,使其运行时复杂度为常数而不是线性。如果对于某个容器类型 X,这是可能的,则模板特化 swap(X&, X&) 可以简单地写成 X::swap(X&)。这意味着只有在存在这样一个常数时间实现时,才应该定义 X::swap(X&)。并非每个容器类 X 都需要具有这样的成员函数,但如果成员函数存在,则保证其为摊销常数时间。
2)如果您需要另一个具有相同元素的容器,并且想要转移所有权,请创建一个简单的副本以提高效率。