将向量<unique_ptr <Derived >>移动到向量<unique_ptr <Base >>

sor*_*h-r 1 c++ move vector unique-ptr c++11

我有两个类,说BaseDerived: public Base两个std::vector,一个持有类型的元素,另一个持有类型的unique_ptr<Base>元素unique_ptr<Derived>如何将所有元素的所有权从第二个向量转移到第一个?我已经尝试过:

vector<unique_ptr<Base>> v1;
vector<unique_ptr<Derived>> v2;
// do something
std::move(v2.begin(),v2.end(),v1.begin()); // This line crashed
v1 = std::move(v2); // And this gives a compiler error
Run Code Online (Sandbox Code Playgroud)

Vau*_*ato 6

v1在进入之前,您需要确保尺寸合适.例如:

#include <algorithm>
#include <vector>
#include <memory>

using std::vector;
using std::unique_ptr;

struct Base {
};

struct Derived : Base {
};

int main()
{
  vector<unique_ptr<Base>> v1;
  vector<unique_ptr<Derived>> v2;
  v2.push_back(unique_ptr<Derived>(new Derived));
  v2.push_back(unique_ptr<Derived>(new Derived));
  v2.push_back(unique_ptr<Derived>(new Derived));
  v1.resize(v2.size());
  std::move(v2.begin(),v2.end(),v1.begin());
}
Run Code Online (Sandbox Code Playgroud)

这是因为移动算法不会改变容器本身的大小.它是这样实现的(取自http://en.cppreference.com/w/cpp/algorithm/move):

template<class InputIt, class OutputIt>
OutputIt move(InputIt first, InputIt last, OutputIt d_first)
{
    while (first != last) {
        *d_first++ = std::move(*first++);
    }
    return d_first;
}
Run Code Online (Sandbox Code Playgroud)

  • 或者使用`std :: back_inserter`. (4认同)

How*_*ant 6

由于我没有看到其他地方的这个答案,我想提醒非常简单的成员函数的每个人assignvector:

vector<unique_ptr<Base>> v1;
vector<unique_ptr<Derived>> v2;
// do something
v1.assign(make_move_iterator(v2.begin()), make_move_iterator(v2.end()));
Run Code Online (Sandbox Code Playgroud)