【问题标题】:C++ STL container - pop with moveC++ STL 容器 - 移动弹出
【发布时间】:2017-09-10 23:34:12
【问题描述】:

是否有一个 STL 容器(无 Boost)可以从中移除元素并将其移动到左值?

假设我有一个大对象 std::vector 和一个变量,我想从向量中弹出一个元素。

var = vec.back();  // non-move assign op
vec.pop_back();    // dtor

var = containerWithMovePop.pop_and_return();  // move assign-op

性能并不是那么重要,我只是想知道是否可行。

【问题讨论】:

  • 为什么不var = std::move(vec.back()); vec.pop_back();
  • 好的,但是vec.back() 在这两个操作之间会处于什么状态?我会说无效,对吗?
  • 它将处于“移出”状态。这种状态是否有效,取决于类型是如何实现的,但所有标准类型都处于“有效但未指定”状态,这通常也推荐用于用户定义的类型。
  • @boofaz:move 需要使对象处于至少在某种程度上有效的状态,因此您仍然可以(至少)销毁它,这就是您所做的一切这里。我相信你应该没问题,只要你不尝试在 move 和 pop_back 之间交叉使用向量数据的任何其他用途。
  • 并且任何类型在移出时都应该至少是可破坏的,并且您不需要任何其他内容。

标签: c++ stl containers move-semantics


【解决方案1】:

正如@aeschpler 所说,这是可行的

auto var = std::move(vec.back()); 
vec.pop_back();

vec.back() 将为空(如果是字符串)或相同(如果是 int),或者在 back 和 pop_back 之间的任何内容(取决于类型),但这没关系。由于析构函数在 pop_back() 中运行,因此那里几乎没有什么可做的。

既然我们有移动语义,我们可能会在未来让 pop_back() 返回 T(正如 ppl 所指出的,在指定 std::vector 时我们没有这样做),但它可能是一种新方法以免破坏向后兼容性。

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2011-02-07
    • 2017-11-06
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2023-03-27
    • 2013-11-04
    相关资源
    最近更新 更多