sor*_*h-r 1 c++ move vector unique-ptr c++11
我有两个类,说Base和Derived: 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)
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)
由于我没有看到其他地方的这个答案,我想提醒非常简单的成员函数的每个人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()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
844 次 |
| 最近记录: |