博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
阅读量:4980 次
发布时间:2019-06-12

本文共 3924 字,大约阅读时间需要 13 分钟。

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中。vector A中的结果我们可想而知,可是vector B中的元素还会怎样?

看看之前写过的程序:

#include 
#include
int main (){ std::vector
myvector (3,100); std::vector
::iterator it; it = myvector.begin(); it = myvector.insert ( it , 200 ); myvector.insert (it,2,300); // "it" no longer valid, get a new one: it = myvector.begin(); std::vector
anothervector (2,400); myvector.insert (it+2,anothervector.begin(),anothervector.end()); int myarray [] = { 501,502,503 }; myvector.insert (myvector.begin(), myarray, myarray+3); std::cout << "myvector contains:"; for (it=myvector.begin(); it

如今关心一下别的:注意是insert后,被insert的vector为多少了:

#include 
#include
int main(){ std::vector
myvector(3, 100); std::vector
anothervector(2, 400); std::cout << "Before insert myvector is:"; for (auto it = myvector.begin(); it

假设你看到此时,你肯定会在心里骂娘,谁还关心vector B,而且vectorB并没有变化。

如今是时候来点猛药了。vector中放智能指针。

之前博客也讲诉过对于vector的元素为智能指针的时候:

#include
#include
#include
using namespace std;void display_vector(vector
> &vec);int main(){ vector
> vec; unique_ptr
s1(new int(1)); unique_ptr
s2(new int(2)); unique_ptr
s3(new int(3)); unique_ptr
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
s5(new int(5)); vector
> 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; //display_vector(vec); cout << "now, vec size: " << vec.size() << endl; for (int i=0; i
> &vec){ for (auto it = vec.begin(); it != vec.end(); it++) { cout << **it << endl; }}

上面代码会崩溃。原因就是vec被insert后 。vec变得无效了,我们不能对他做什么。。。。。

可是须要明白的是这不是insert造成的,假设copy也会造成这一的结局,事实上罪魁祸首就是make_move_iterator

再看程序:

#include 
#include
#include
#include
#include
int main(){ std::list
s{ "one", "two", "three" }; std::vector
v1(s.begin(), s.end()); // copy std::vector
v2(std::make_move_iterator(s.begin()), std::make_move_iterator(s.end())); // move std::cout << "v1 now holds: "; for (auto str : v1) std::cout << "\"" << str << "\" "; std::cout << "\nv2 now holds: "; for (auto str : v2) std::cout << "\"" << str << "\" "; std::cout << "\noriginal list now holds: "; for (auto str : s) std::cout << "\"" << str << "\" "; std::cout << '\n';}//输出://v1 now holds : "one" "two" "three"//v2 now holds : "one" "two" "three"//original list now holds : ""

最后再上一个官方程序:

#include 
// std::cout#include
// std::make_move_iterator#include
// std::vector#include
// std::string#include
// std::copyint main() { std::vector
foo(3); std::vector
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;}

* 须要注意:*

* bar.clear();*
因此此时: bar now contains unspecified values; clear it:

转载于:https://www.cnblogs.com/liguangsunls/p/7150544.html

你可能感兴趣的文章
Java基础常见英语词汇
查看>>
nginx启动、关闭命令、重启nginx报错open() "/var/run/nginx/nginx.pid" failed
查看>>
UINavigationController的视图层理关系
查看>>
组件:slot插槽
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>
POJ 1308 Is It A Tree?(并查集)
查看>>
N进制到M进制的转换问题
查看>>
php PDO (转载)
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
highcharts 图表实例
查看>>
highcharts曲线图
查看>>
extjs动态改变样式
查看>>
宏定义
查看>>
笔记:git基本操作
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
HOT SUMMER 每天都是不一样,积极的去感受生活 C#关闭IE相应的窗口 .
查看>>
optionMenu-普通菜单使用
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>