使用std :: move

Dan*_*ani 11 c++ c++11

C++11我使用swap-to-back避免深度复制开销之前,例如:

vector<vector<Object> > Objects;

for(/* some range */)
{
    vector<Object> v;
    for(/* some other range */)
    {
        v.push_back(/* some object */);
    }
    Objects.push_back(vector<Object>());
    Objects.back().swap(v);
}
Run Code Online (Sandbox Code Playgroud)

如何使用std::move移动vObjects以避免深拷贝的开销,而不是swap
我知道这里有很多变通方法,比如多数组或直接插入Objects.back(),但我需要一个使用std::move它的例子来理解它.

K-b*_*llo 17

Objects.push_back( std::move( v ) );
Run Code Online (Sandbox Code Playgroud)

  • 获得正确答案并获得较少关注的+1 (2认同)

seh*_*ehe 16

vector<vector<Object> > Objects;

for(/* some range */)
{
    vector<Object> v;
    for(/* some other range */)
    {
        v.push_back(/* some object */);
    }
    Objects.push_back(std::move(v));
}
Run Code Online (Sandbox Code Playgroud)

  • @Dani:在上面的代码中显示的`move`之后你想用'v`做什么?他所做的就是破坏它.由于`~vector <Object>()`没有先决条件,因此`move`之后的破坏完全正常.还有其他你想做的事吗?如果是这样你可以把它放到一个已知的状态,其中有一些简单的东西,如`v.clear()`(`vector <Object> :: clear()`也没有先决条件,因此可以在`move`之后调用). (9认同)
  • @Dani:不要假设.试试吧.实际上,阅读`vector :: vector(vector &&)`的源代码也足够了.语义与你的`std :: swap`版本非常接近 - 但在一般情况下更优雅,可能更有效 (2认同)