【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列的二位数组;

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

相关推荐
苦夏木禾11 分钟前
js请求避免缓存的三种方式
开发语言·javascript·缓存
重庆小透明16 分钟前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
超级土豆粉19 分钟前
Turndown.js: 优雅地将 HTML 转换为 Markdown
开发语言·javascript·html
lang2015092821 分钟前
Reactor操作符的共享与复用
java
TTc_32 分钟前
@Transactional事务注解的批量回滚机制
java·事务
wei_shuo1 小时前
飞算 JavaAI 开发助手:深度学习驱动下的 Java 全链路智能开发新范式
java·开发语言·飞算javaai
熊猫钓鱼>_>1 小时前
用Python解锁图像处理之力:从基础到智能应用的深度探索
开发语言·图像处理·python
小小小小王王王2 小时前
求猪肉价格最大值
数据结构·c++·算法
GO兔2 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
欧阳秦穆2 小时前
apoc-5.24.0-extended.jar 和 apoc-4.4.0.36-all.jar 啥区别
java·jar