【C++初阶】探索STL之——vector
- 1.什么是vector
- 2.vector的使用
- 2.1 vector的定义
- 2.2 vector iterator(迭代器)的使用
- 2.3 vector空间问题
- 2.4 vector的增删查改
- 2.5 vector迭代器失效的问题
- 2.5.1 vector常见迭代器失效的操作
- 3 动态二位数组
1.什么是vector
vector其实就是一个可以储存数组的容器,其次它的大小是可以改变的,想要了解更多详细信息可以查看vector文档,(vector文档介绍)
2.vector的使用
2.1 vector的定义
代码实现:
vector<int> s1;//无参构造
vector<int> s2(5, 0);//开辟5个空间,用0去初始化
vector<int> s3(s2);//拷贝构造,将s2拷贝给s3
vector<int> s4(6,1);
vector<int> s5(s4.begin(), s4.end());//使用迭代器初始化
运行结果:
由于s1没有参数,所以打印出来是空白的
2.2 vector iterator(迭代器)的使用
一般迭代器在使用范围for或者在定义时对其他对象初始化时使用,你只要记住它是一个指针,不同的迭代器指向的位置不同就行了,代码演示如下:
vector<int> s1;
s1.push_back(1);
s1.push_back(2);
s1.push_back(3);
s1.push_back(4);
s1.push_back(5);
cout <<*( s1.begin()) << endl;
cout << *(s1.end()-1) << endl;
cout << *(s1.rbegin()) << endl;
cout << *(s1.rend()-1) << endl;
运行结果:
2.3 vector空间问题
这里的前面3个接口很好理解,其中后面理解起来稍微有点吃力。简单的来说:resize如果你给的n值比原来vector的数据个数小,那么这个vector会缩小它的size为n,反之它会对你的vector进行扩容,其余的部分用val值来填充,然后size的值也会变为n。
reserve就是改变vector 的容量,如果你reserve给的值比原来vector的容量(capacity)还小,他也不会影响你原来的数据,也可以理解为编译器不会运行你的这段代码,它也不会报错。
2.4 vector的增删查改
vector <int> s1;
s1.push_back(1);//尾插1
s1.push_back(2);//尾插2
s1.push_back(3);//尾插3
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
s1.pop_back();//尾删
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
auto pos = find(s1.begin(),s1.end(), 2);//find返回的是要查询数据位置的迭代器
cout <<*(pos) << endl;
s1.insert(s1.begin(), 8);//在指定位置插入
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
s1.erase(s1.begin());//删除指定位置的数据
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
vector<int>s2(4, 0);
s1.swap(s2);//交换两个vector的数据
for (int i = 0; i < s1.size(); i++)
{
cout << s1[i];
}
cout << endl;
cout << s1[2] << endl;//vector也支持下标+[]访问
运行结果:
其实这些接口还有很多的用法,这里只是展示了部分使用频率比较多的用法和结果,所以要多多的去查看文档(vector文档),
加深自己的印象。
2.5 vector迭代器失效的问题
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。
2.5.1 vector常见迭代器失效的操作
1.resize 、reserve、push_back、insert等可能会扩容的操作都会导致迭代器失效。
因为扩容的操作会销毁旧空间,这也导致之前迭代器指向的空间被销毁了,如果后面还要使用就会报错,这也就说明该迭代器已经失效了,除非后面你对迭代器进行了更新,让他指向新的空间,这样就不会失效了。
2.指定位置删除-erase
假设你使用pos去记录vector中的一个数据,如果你使用erase去删除它,如果这个数后面还有其他 数据,那这个迭代器不会失效,因为你删除该位置的数据后,后面的数据会往前移,因此就不会失效了。
但是如果这个pos记录的是vector最后一个数据话,删除这个数据后,这个迭代器就会失效,因为数据往前移后,pos指向的位置没有值了。
所以想要解决迭代器失效的办法:在使用前,对迭代器重新赋值即可。
3 动态二位数组
vector<int> s1(4,0);
vector<vector<int>> s2(4, s1);
构造一个s2动态二维数组,s2中总共有4个元素,每个元素
都是vector类型的s1,这也巧妙的构成了一个4行4列的二位数组;
创作不易,还请三连,有不对的地方还请大佬们指点一二!