1.向顺序容器中添加元素错误程序:
vector<int> vec1{ 5, 6, 7, 8, 9 }; vector<int> vec2{ 3, 4, 5, 6, 7 }; list<int> ilist{ 1, 2, 3, 4, 5 }; //1.在尾部创建一个值t或者args,返回为void //1.1push_back(t) //1.2.emplace_back(args) vec1.push_back(10); for (auto i : vec1) cout << i << " "; cout << endl; vec1.emplace_back(11, 12, 13, 14); for (auto i : vec1) cout << i << " "; cout << endl; //2.在头部创建一个值t或者args,返回void;仅list forward_list deque支持push_front //2.1push_front(t) //2.2emplace_front(args) ilist.push_front(1); for (auto i : ilist) cout << i << " "; cout << endl; ilist.emplace_front(1, 2, 3, 4); for (auto i : ilist) cout << i << " "; cout << endl; //3.在迭代器p指向的元素之前创建一个值为t或者args的元素 //3.1c.insert(p,t) //3.1c.insert(p,n,t)n是t元素个数 //3.1c.inser(p,b,e)b和e是另一个容器的两个迭代器 //3.1c.insert(p,il)il是{}围起来的元素列表 //3.2c.emplace(p,args) vector<int>::iterator beg = vec1.begin(); vector<int>::iterator it = vec2.begin(); vec2.insert(it, 0);//在首元素之前加0 for (auto i : vec2) cout << i << " "; cout << endl; vec2.insert(it, 2, 1);//在首元素之前加两个1 for (auto i : vec2) cout << i << " "; cout << endl; vec2.insert(it, beg + 3, beg + 6);//在it位置之前加入beg+3到beg+6的元素 for (auto i : vec2) cout << i << " "; cout << endl; vec2.insert(vec1.end(), { 0, 0, 0, 0 }); for (auto i : vec2) cout << i << " "; cout << endl; vec2.emplace(it + 2, 1); for (auto i : vec2) cout << i << " "; cout << endl;
错误提示1.主要原因是因为上述红色部分:
1>------ 已启动全部重新生成: 项目: test_vector, 配置: Debug Win32 ------ 1> test.cpp 1>f:\program files\microsoft visual studio 12.0\vc\include\xmemory0(600): fatal error C1001: 编译器中发生内部错误。 1> (编译器文件“f:\dd\vctools\compiler\cxxfe\sl\p1\c\trees.h”,第 589 行) 1> 要解决此问题,请尝试简化或更改上面所列位置附近的程序。 1> 请选择 Visual C++ 1> “帮助”菜单上的“技术支持”命令,或打开技术支持帮助文件来获得详细信息。 1> 1>cl : 命令行 warning D9028: 最小重新生成失败,正在转换为标准生成 ========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
错误提示2程序中蓝色阴影部分:
显示为out of range
错误原因:
vector | 可变大小数组.支持快速随机访问。在尾部之外的位置插入或删除元素 |
deque | 双端队列。支持快速随机访问。在头尾位置插入、删除速度快 |
list | 双向链表。只支持单向顺序访问。在list中任何位置进行插入、删除操作速度快 |
forward_list | 单向链表。只支持单向顺序访问。在链表任何位置进行插入、删除操作速度快 |
array | 固定大小数组,支持快速随机访问。不能添加或者删除元素 |
string | 与vector相似的容器。但专门用于保存字符。随机访问快,在尾部插入、删除元素 |
1.上述程序中需要修改的地方:
vector<int> vec1{ 5, 6, 7, 8, 9 }; vector<int> vec2{ 3, 4, 5, 6, 7 }; list<int> ilist{ 1, 2, 3, 4, 5 }; //1.在尾部创建一个值t或者args,返回为void //1.1push_back(t) //1.2.emplace_back(args) vec1.push_back(10);//{5,6,7,8,9,10} for (auto i : vec1) cout << i << " "; cout << endl; vec1.emplace_back(11);//此处修改为1个值,{5,6,7,8,9,10,11} for (auto i : vec1) cout << i << " "; cout << endl; //2.在头部创建一个值t或者args,返回void;仅list forward_list deque支持push_front //2.1push_front(t) //2.2emplace_front(args) ilist.push_front(1);//{1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; ilist.emplace_front(2);//{2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; //3.在迭代器p指向的元素之前创建一个值为t或者args的元素 //3.1c.insert(p,t) //3.1c.insert(p,n,t)n是t元素个数 //3.1c.inser(p,b,e)b和e是另一个容器的两个迭代器 //3.1c.insert(p,il)il是{}围起来的元素列表 //3.2c.emplace(p,args) vector<int>::iterator beg = vec1.begin(); list<int>::iterator it = ilist.begin();//此处将vector修改为ilist,下同 ilist.insert(it, 0);//在首元素之前加0{0,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; ilist.insert(it, 2, 1);//在首元素之前加两个1{0,1,1,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; ilist.insert(it, beg, beg + 3);//在it位置之前加入beg到beg+3的元素{0,1,1,5,6,7,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; ilist.insert(ilist.end() , { 0, 0, 0, 0 });//{0,1,1,5,6,7,2,1,1,2,3,4,5,0,0,0,0} for (auto i : ilist) cout << i << " "; cout << endl; ilist.emplace(it, 1);//{0,1,1,5,6,7,1,2,1,1,2,3,4,5,0,0,0,0} for (auto i : ilist) cout << i << " "; cout << endl;
2.解释上述结果
- 在《C++ primer》中,提示:向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用 和指针失效->在一个vector或者string尾部之外的任何位置添加元素,都需要移动元素,而且,向一个vector或者string中添加元素可能引起整个对象存储空间的重新分配。
- 容器插入元素其实是拷贝的过程;
- insert操作返回的新添加的第一个元素的迭代器;
- 迭代器在执行insert操作时,始终认为2元素的位置为首元素地址,若想改变使每一个都以最近的一个为首地址,则可以如下修改
vector<int>::iterator beg = vec1.begin(); list<int>::iterator it = ilist.begin();//此处将vector修改为ilist,下同 ilist.insert(it, 0);//在首元素之前加0{0,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; list<int>::iterator it1 = ilist.begin(); ilist.insert(it1, 2, 1);//在首元素之前加两个1{1,1,0,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; list<int>::iterator it2 = ilist.begin(); ilist.insert(it2, beg, beg + 3);//在it位置之前加入beg到beg+3的元素{5,6,7,1,1,0,2,1,1,2,3,4,5} for (auto i : ilist) cout << i << " "; cout << endl; list<int>::iterator it3 = ilist.begin(); ilist.insert(ilist.end(), { 0, 0, 0, 0 });//{5,6,7,1,1,0,2,1,1,2,3,4,5,0,0,0,0} for (auto i : ilist) cout << i << " "; cout << endl; list<int>::iterator it4 = ilist.begin(); ilist.emplace(it4, 1);//{1,5,6,7,1,1,0,2,1,1,2,3,4,5,0,0,0,0} for (auto i : ilist) cout << i << " "; cout << endl;
时间: 2024-10-06 00:28:32