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

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

相关推荐
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
序属秋秋秋1 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂7 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
风吹落叶花飘荡7 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript