C++"从容器中移出"

GMa*_*ckG 18 c++ containers rvalue-reference c++11

在C++ 11中,std::move当我们想要将值移动(破坏性地复制)到容器中时,我们可以提高效率:

SomeExpensiveType x = /* ... */;
vec.push_back(std::move(x));
Run Code Online (Sandbox Code Playgroud)

但我找不到任何其他方式.我的意思是这样的:

SomeExpensiveType x = vec.back(); // copy!
vec.pop_back(); // argh
Run Code Online (Sandbox Code Playgroud)

这在适配器上更常见(copy-pop)stack.可能存在这样的事情:

SomeExpensiveType x = vec.move_back(); // move and pop
Run Code Online (Sandbox Code Playgroud)

为了避免副本?这已经存在了吗?我在n3000中找不到类似的东西.

我有一种感觉,我错过了一些非常明显的东西(比如它的不必要),所以我准备好了"ru dum".:3

lei*_*eiz 17

我可能在这里完全错了,但不是你想要的

SomeExpensiveType x = std::move( vec.back() ); vec.pop_back();
Run Code Online (Sandbox Code Playgroud)

假设SomeExpensiveType有一个移动构造函数.(显然适用于您的情况)

  • @Jerry:不,"移动"对象仍然有效.它存在,它通常只是重置为一个非常简单的状态.它的生命周期还没有到期,它的析构函数没有被调用,但是它将被调用.就语言而言,该对象是完全有效的 (3认同)
  • @Scary:`back`返回一个引用,并使用`std :: move`将其转换为rvalue-reference. (2认同)
  • @GMan:不用担心,`move`是由班级提供的服务,而不是容器.容器中的对象仍然保证有效. (2认同)
  • @Jerry @jalf @Daniel:应该注意标准所说的内容已经改变了.从FCD,表34和36(从33移动,不相关)说:"注意:rv仍然是一个有效的对象.它的状态是未指定的 - 结束注释]"所以它是明确的:移动的对象需要能够安全地破坏,但没有指定其他内容.很高兴他们清除了这一点. (2认同)