【问题标题】:Transfer ownership within STL containers?在 STL 容器中转移所有权?
【发布时间】:2010-11-30 18:14:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • 旁注:“swap”已经被提及。但我想补充一点,在 C++0x 中,你可以简单地将“OvertakeContents”替换为“std::move”,它会做你想做的事。

标签: c++ stl ownership


【解决方案1】:

检查 std::swap

vector<T> v1; 
// fill v1

vector<T> v2;

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

Swap Reference

【讨论】:

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

std::vector 有一个 swap() 函数,其工作原理与此非常相似。

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

【讨论】:

  • 我差点给你投赞成票,但是,你的代码在语法上是错误的。
【解决方案3】:

这里有两点:

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

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

【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2017-09-10
    • 2014-10-10
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多