实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
来源:互联网 发布:fx2n编程手册 编辑:程序博客网 时间:2024/06/08 01:59
现在就讨论一下,把vector作为函数的参数进行传递。
也是直接上一段代码:
#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)); display_vector(vec);//还是所有权的问题 return 0;}void display_vector(vector<unique_ptr<int>> vec){ for (auto it = vec.begin(); it != vec.end(); it++) { cout << **it << endl; }}
这个时候给display_vector传递std::move(vec)作为参数,并看一下调用display_vector函数后,vec变成了什么呢?
#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)); display_vector(std::move(vec)); 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; }}//输出:1234now, vec size:0
传统的想法,我们传递的是值,而非引用,那为什么会影响vec呢,还是所有权转移问题。
那么我们如何不改变vec呢?
只要按引用、或是const引用传递即可,就不涉及到所有权的转移问题:
#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)); display_vector(vec); 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; }}//输出:1234now, vec size:4
1 0
- 实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
- 实战c++中的vector系列--vector<unique_ptr<>>赋值给vector<unique_ptr<>>
- 实战c++中的vector系列--使用sort算法对vector<unique_ptr<string>>进行排序(sort函数“应输入 2 个参数,却提供了 3 个)
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(所有权转移)
- 实战c++中的vector系列--vector的一些异常
- C++ 中如何用 vector类作为函数的参数
- std::list/vector 作为函数参数的传递方式
- C++ 中如何用 vector类作为函数的参数
- C++ 中如何用 vector类作为函数的参数
- 实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())
- 实战c++中的vector系列--emplace_back造成的引用失效
- 实战c++中的vector系列--使用vector构造二维数组
- 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
- vector作为参数的三种传参方式
- Vector作为参数的三种传参方式
- 实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)
- 实战c++中的vector系列--可怕的迭代器失效之二(删除vector中元素)
- 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
- 树莓派SD卡制作(Windows下制作Debian镜像)
- Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有
- 实习日志(1)初识flex & bison (计算器的设计)
- 黑马程序员_java IO流
- 源程序分析
- 实战c++中的vector系列--vector<unique_ptr<>>作为函数的参数
- Xcode7 Http请求
- AdaBoost--从原理到实现
- spring mvc controller间跳转 重定向 传参
- 海量数据处理学习
- poj1703
- 网络流男女配对问题java实现
- PHP mb_convert_encoding()函数
- 总结