【C++初阶】探索STL之——vector

【C++初阶】探索STL之------vector

  • 1.什么是vector
  • 2.vector的使用
    • [2.1 vector的定义](#2.1 vector的定义)
    • [2.2 vector iterator(迭代器)的使用](#2.2 vector iterator(迭代器)的使用)
    • [2.3 vector空间问题](#2.3 vector空间问题)
    • [2.4 vector的增删查改](#2.4 vector的增删查改)
    • [2.5 vector迭代器失效的问题](#2.5 vector迭代器失效的问题)
      • [2.5.1 vector常见迭代器失效的操作](#2.5.1 vector常见迭代器失效的操作)
  • [3 动态二位数组](#3 动态二位数组)

1.什么是vector

vector其实就是一个可以储存数组的容器,其次它的大小是可以改变的 ,想要了解更多详细信息可以查看vector文档,(vector文档介绍)

2.vector的使用

2.1 vector的定义


代码实现:

cpp 复制代码
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或者在定义时对其他对象初始化时使用,你只要记住它是一个指针,不同的迭代器指向的位置不同就行了,代码演示如下:

cpp 复制代码
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的增删查改

cpp 复制代码
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 动态二位数组

cpp 复制代码
vector<int> s1(4,0);

vector<vector<int>> s2(4, s1);

构造一个s2动态二维数组,s2中总共有4个元素,每个元素

都是vector类型的s1,这也巧妙的构成了一个4行4列的二位数组;

创作不易,还请三连,有不对的地方还请大佬们指点一二!

相关推荐
customer08几秒前
【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
-VE-14 分钟前
模板初阶(c++)
开发语言·c++
shigen0114 分钟前
结合HashMap与Java 8的Function和Optional消除ifelse判断
java·开发语言
CN.LG15 分钟前
浅谈Python之协程
开发语言·python
国中之林30 分钟前
【C++ Primer Plus习题】17.5
开发语言·c++·学习·刷题
yuhaiqiang31 分钟前
超乎你的想象!SpringBoot处理1 次 Http请求竟需要申请这么一大块内存!
java·spring
砖业洋__35 分钟前
Spring高手之路24——事务类型及传播行为实战指南
java·spring·事务·nested·事务传播行为
黄俊懿36 分钟前
【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
java·分布式·后端·spring cloud·微服务·架构·手写源码
追风筝的Coder40 分钟前
泛微开发修炼之旅--44用友U9与ecology对接方案及源码
java
CXDNW40 分钟前
【算法篇】栈与队列类(笔记)
c++·笔记·算法·leetcode··队列