一、iterator的使用注意
begin与end
遵循左闭右开的原则,begin 指向vector的第一个元素,end 指向vector的最后一个元素的往下一个位置。
rbegin 与 rend
rbegin指向最后一个元素的位置,rend指向第一个元素的往前一个位置。
二、vector的常用接口
常用接口如下,不一一运行查看结果了,直接粘贴到本地运行看一下就懂了
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;int main()
{vector<int>v;for (int i = 1; i < 10; i++){//尾插v.push_back(i);}for (auto e : v){cout << e << " ";}cout << endl;//获取vector的个数cout << v.size() << endl;//获取vector的容量大小cout << v.capacity() << endl;//判空bool emp = v.empty();cout << emp << endl;//改变vector的sizev.resize(200);cout << v.size()<<endl;//改变vector的capacityv.reserve(300);cout << v.capacity() << endl;//insert,在某个位置之前插入vector<int>v1 = { 1,2,3,4,5 };v1.insert(v1.begin()+1, 100);for (auto e : v1){cout << e<<" ";}cout << endl;//find查找,算法模块实现,不是vector的成员接口auto it = find(v1.begin(), v1.end(), 5);if (it != v1.end()){cout << "找到了" << endl;}//erase,删除指定位置元素auto pos = v1.begin() + 1;v1.erase(pos);for (auto e : v1){cout << e << " ";}cout << endl;//对[]的重载,使vector能像数组那样访问cout << v1[0] << endl;return 0;
}
三、迭代器失效问题
首先我们需要记住一句话:迭代器的底层是一个指针
如果指针所指向的空间被销毁的,那么该指针就是一个野指针了,那么以该指针为底层的迭代器自然就失效了
resize、reserve、insert、 assign、push_back等都有可能会造成迭代器失效的问题
以下面的代码为例:
int main()
{vector<int> v{1, 2, 3, 4, 5, 6};auto it = v.begin();//原本的vector空间有可能不足,那么会进行扩容//旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,//实际操作的是一块已经被释放的空间,而引起代码运行时崩溃//用100个8来填充该vectorv.resize(100, 8);//v.reserve(100);将容量扩大到100,但是有效个数还是不变的// v.insert(v.begin(), 0);如果有效个数=最大容量,此时插入可能会造成迭代器失效//v.push_back(8);//v.assign(100, 8);//对该vector重新赋值//如何解决:让it重新指向vector即可,那样无论是否释放原本的空间,迭代器都指向当前的空间//it = v.begin(); 这步是解决迭代器失效问题while (it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}