我有两个课程,比如Base
和Derived: public Base
以及两个std::vector
,一个持有unique_ptr<Base>
类型的元素,另一个持有{{1}类型的元素如何将所有元素的所有权从第二个向量转移到第一个向量?我已经尝试过了:
unique_ptr<Derived>
答案 0 :(得分: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());
}
这是因为移动算法不会改变容器本身的大小。它是这样实现的(取自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;
}
答案 1 :(得分:6)
由于我在其他地方没有看到这个答案,我想提醒大家assign
的非常简单的成员函数vector
:
vector<unique_ptr<Base>> v1;
vector<unique_ptr<Derived>> v2;
// do something
v1.assign(make_move_iterator(v2.begin()), make_move_iterator(v2.end()));
答案 2 :(得分:1)
按元素进行。
for (auto&& elem : v2)
{
v1.push_back(std::move(elem));
}
答案 3 :(得分:0)
您可以使用以下内容:
std::vector<std::unique_ptr<Base>> v1(v2.size());
std::copy(std::make_move_iterator(v2.begin()), std::make_move_iterator(v2.end()), v1.begin());
答案 4 :(得分:0)
template<class Dest, class Src>
void move_contents_to(Dest&dest, Src const& src)=delete;
template<class Dest, class Src>
void move_contents_to(Dest&dest, Src& src)=delete;
template<class Dest, class Src>
void move_contents_to(Dest&dest, Src&& src){
using std::begin; using std::end;
dest = Dest{std::make_move_iterator(begin(src)),std::make_move_iterator(end(src))};
}
以上内容适用于大多数std
容器,并且可以在右侧使用原始C样式数组。为安全起见,我要求src
为右值参考,因此移动的参考是明确的。