实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
来源:互联网 发布:易投水利造价软件 编辑:程序博客网 时间:2024/06/10 16:30
之前博客讲到 vector可以使用insert方法,将一个vector copy到另一个vector的后面。
之前的博客也讲到过,如果vector容器内部放的是unique_ptr是需要进行所有权转移的。
现在就来八一八如何vector<unique_ptr<>> insert to vector<unique_ptr<>>
如果常规的vector,我们就可以这么使用insert:
// inserting into a vector#include <iostream>#include <vector>int main (){ std::vector<int> myvector (3,100);//100 100 100 std::vector<int>::iterator it; it = myvector.begin(); it = myvector.insert ( it , 200 );//200 100 100 100 myvector.insert (it,2,300);//300 300 200 100 100 100 // "it" no longer valid, get a new one: it = myvector.begin(); std::vector<int> anothervector (2,400); myvector.insert (it+2,anothervector.begin(),anothervector.end());//now, 300 300 400 400 200 100 100 100 int myarray [] = { 501,502,503 }; myvector.insert (myvector.begin(), myarray, myarray+3); std::cout << "myvector contains:"; for (it=myvector.begin(); it<myvector.end(); it++) std::cout << ' ' << *it; std::cout << '\n'; return 0;}//输出:501 502 503 300 300 400 400 200 100 100 100
但是对于vector内的unique point来说,就不能简单的使用普通迭代器了:需要使用对迭代器就行std::make_move_iterator操作:
看下英文描述最可靠:
A move_iterator is an iterator adaptor that adapts an iterator (it) so that dereferencing it produces rvalue references (as if std::move was applied), while all other operations behave the same.
就跟我们之前用到的std::move作用是一样一样的~
看看使用例子:
#include <iostream> // std::cout#include <iterator> // std::make_move_iterator#include <vector> // std::vector#include <string> // std::string#include <algorithm> // std::copyint main () { std::vector<std::string> foo (3); std::vector<std::string> bar {"one","two","three"}; std::copy ( make_move_iterator(bar.begin()), make_move_iterator(bar.end()), foo.begin() ); // bar now contains unspecified values; clear it: bar.clear(); std::cout << "foo:"; for (std::string& x : foo) std::cout << ' ' << x; std::cout << '\n'; return 0;}//输出:foo: one two three
接下来就是我们的使用了,简单了吧:
#include<iostream>#include<vector>#include <memory>using namespace std;void display_vector(vector<unique_ptr<int>> &vec);int main(){ vector<unique_ptr<int>> vec; unique_ptr<int> s1(new int(1)); unique_ptr<int> s2(new int(2)); unique_ptr<int> s3(new int(3)); unique_ptr<int> s4(new int(4)); vec.push_back(std::move(s1)); vec.push_back(std::move(s2)); vec.push_back(std::move(s3)); vec.push_back(std::move(s4)); unique_ptr<int> s5(new int(5)); vector<unique_ptr<int>> des_vec; des_vec.push_back(std::move(s5)); des_vec.insert(des_vec.end(), std::make_move_iterator(vec.begin()), std::make_move_iterator(vec.end())); display_vector(des_vec); cout << "now, des_vec size: " << des_vec.size() << endl; cout << "now, vec size: " << vec.size() << endl; return 0;}void display_vector(vector<unique_ptr<int>> &vec){ for (auto it = vec.begin(); it != vec.end(); it++) { cout << **it << endl; }//输出结果:51234now, des_vec size: 5now, vec size: 4
1 0
- 实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(所有权转移)
- 实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
- 实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
- 实战c++中的vector系列--使用vector构造二维数组
- 实战c++中的vector系列--vector的一些异常
- 实战c++中的智能指针unique_ptr系列-- unique_ptr与lambda的错误结合(尤其是捕获lambda中的unique_ptr)
- 实战c++中的智能指针unique_ptr系列-- unique_ptr的get_deleter方法(自定义删除器)
- 实战c++中的智能指针unique_ptr系列-- 使用unique_ptr来避免if多层嵌套
- 实战c++中的智能指针unique_ptr系列--通过unique_ptr对shared_ptr进行初始化
- 实战c++中的vector系列--creating vector of local structure、vector of structs initialization
- 实战c++中的智能指针unique_ptr系列-- unique_ptr的get()赋给普通指针后的崩溃(其实是生命周期惹的祸)
- vector赋值
- c++11 container liber: std::queue std::map std::vector std::unique_ptr
- unique_ptr
- unique_ptr
- unique_ptr
- unique_ptr
- 黑马程序员 - OC语言 - NSString介绍及基本使用 (文件读取、写入)
- Android BaseAadapter适配器
- 解决:Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
- 基于RTSP的流媒体播放器制作(1)
- vs2013报错 无法打开包含文件 "winsock2.h" 的一种解决办法
- 实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
- java截取字符串,截串,substring和split,分割字母和数字,正则缝隙
- 介绍一下Python科学计算常用的工具、库、发行版
- Codeforces Round #313 (Div. 2) 560D Equivalent Strings(dos)
- Git入门---一般使用
- 什么是maven
- **线程里面使用注解(线程里面spring使用注解无法注入值的解决办法)**
- 双向链表
- 【leetcode题解】【再看一遍】【86】【M】Contains Duplicate III