c++ vector用法 入门必看 超详细_vector c++ 用法-程序员宅基地

技术标签: 算法  c++  数据结构  

1、vector的作用

vector是最常用的容器之一,功能十分强大,可以储存、管理各种类型的数据。在很多情况下可以用来代替功能比较局限的普通数组,因为我们知道,普通数组只能实现一对一的映射而不能实现一对多的映射,vector就是专门为了解决这个问题而诞生的。vector也可以称为动态数组,因为其大小是根据实时更新而变化的,正因为如此vector显得更加灵活易用。

举个例子
小明拥有一根香蕉和两个苹果
小芳拥有一根棒棒糖个三个梨
那么你试着思考一下,应当如何在程序中表示这种结构呢?这就是一对多映射的例子,学完vector就可以轻松解决这个问题了。

2、vector的定义

vector<储存的类型> 容器名
如:
储存int型的值 vector<int> v;
储存double型的值 vector<double> v;
储存string型的值 vector<string> v;
储存结构体或者类的值的值 vector<结构体名> v;

当然也可以定义vector数组:
储存int型的值 vector<int> v[n];
储存double型的值 vector<double> v[n];
等等,n为数组的大小

3、vector常用的成员函数

//这些都是必会的成员函数
size()//返回返回容器中元素个数
begin()//返回头部迭代器
end()//返回尾部+1迭代器
rbegin()//返回逆首部迭代器
rend()//返回逆尾部-1迭代器
front()//返回首个元素
back()//返回尾部元素
push_back()//在末尾添加一个元素
emplace_back()//和push_back()是一样的作用
pop_back()//弹出最后一个元素
empty()//判断是否为空
insert()//在指定位置插入元素
erase()//在指定位置删除元素
clear()//清空容器

详细解析:
(1)size()
size()是最常用的成员函数了,常用于vector的遍历和元素个数的查询

(2)push_back()
除了初始化以外,push_back()是vector最重要的修改函数了,复杂度为O(1),而insert()的复杂度为O(n),差距明显

(3)front()、back()
查询首元素和未元素,其实通过随机访问,v[0]、v[v.size()-1]是可以达到相同效果的,用front()和back()显得专业点

(4)begin()、end()
通常用来方便排序的,也可以用来遍历,但没必要,通过下标遍历更简单快捷,rbegin()、rend()则可以用来逆序排序

(5)insert()
insert (position, x );
insert (position, n, x );
insert (position, first, last );
插入新的元素,
第一个函数,在迭代器指定的位置前插入值为x的元素
第二个函数,在迭代器指定的位置前插入n个值为x的元素
第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last
复杂度很高,迫不得已不使用

(6)erase()
erase ( position );
erase (first, last );
删除元素或一段序列
同样地,复杂度很高,迫不得已不使用

示例代码:

#include<iostream>//c++标准头文件,可以使用cout,cin等标准编译用法
#include<vector>//使用vector时需要的头文件 
#include<algorithm>//包含许多内置函数,如排序、倒置、交换等函数 
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,map,set,vector,queue时都要使用
//遍历函数 
void print(auto v){
    
	for(auto c:v){
    
		cout<<c<<' ';
	}
	cout<<endl;
}
int main(){
    
	vector<int> v;//定义一个 int型vector 
	
	v.emplace_back(3);
	v.emplace_back(4);
	v.emplace_back(1);
	v.emplace_back(2);
	cout<<"现在有的元素 :";
	print(v);
	cout<<endl;
	
	cout<<"v.front()="<<v.front()<<endl;
	cout<<"v.back()="<<v.back()<<endl;
	cout<<endl;
	
//	排序
	sort(v.begin(),v.end());
	cout<<"排序后 :";
	print(v);
	cout<<"v.front()="<<v.front()<<endl;
	cout<<"v.back()="<<v.back()<<endl;
	cout<<"v.size()="<<v.size()<<endl;
	cout<<endl;
	
//	插入5、6 
	v.insert(v.begin()+2,{
    5,6}); 
	cout<<"插入5、6后: ";
	print(v);
	cout<<endl;
	
//	倒置
	reverse(v.begin(),v.end());
	cout<<"倒置后: ";
	print(v);
	cout<<endl;
	
//	逆序排序 
	sort(v.rbegin(),v.rend());
	cout<<"逆序排序后 :";
	print(v);
	
//	判断是否为空
	cout<<"v.empty()="<<v.empty()<<endl; 
	cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
	cout<<endl;
	
	v.clear();
	cout<<"v清空后"<<endl; 
	cout<<"v.empty()="<<v.empty()<<endl; 
	cout<<"(v.size()==0)="<<(v.size()==0)<<endl;
} 

运行结果:

现在有的元素 :3 4 1 2

v.front()=3
v.back()=2

排序后 :1 2 3 4
v.front()=1
v.back()=4
v.size()=4

插入56: 1 2 5 6 3 4

倒置后: 4 3 6 5 2 1

逆序排序后 :6 5 4 3 2 1
v.empty()=0
(v.size()==0)=0

v清空后
v.empty()=1
(v.size()==0)=1

4、vector的三种遍历方法

(1)迭代器iterator

代码:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    
	vector<int> v;//定义 
	v.emplace_back(1);//插入元素1 
	v.emplace_back(3);//插入元素3
	v.emplace_back(2);//插入元素2
	vector<int>::iterator it;//使用迭代器
	for(it=v.begin();it!=v.end();it++){
    
		cout<<*it<<' ';
	} 
} 

运行结果:

1 3 2

(2)下标遍历

代码:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    
	vector<int> v;//定义 
	v.emplace_back(1);//插入元素1 
	v.emplace_back(3);//插入元素3
	v.emplace_back(2);//插入元素2
	for(int i=0;i<v.size();i++){
    
		cout<<v[i]<<' ';
	}
} 

运行结果:

1 3 2

(3)foreach遍历

代码:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    
	vector<int> v;//定义 
	v.emplace_back(1);//插入元素1 
	v.emplace_back(3);//插入元素3
	v.emplace_back(2);//插入元素2
	for(int c:v){
    
		cout<<c<<' ';
	}
} 

运行结果:

1 3 2

两种逆序遍历:
代码:

#include<iostream>
#include<vector>
using namespace std;
int main(){
    
	vector<int> v;//定义 
	v.emplace_back(1);//插入元素1 
	v.emplace_back(3);//插入元素3
	v.emplace_back(2);//插入元素2
	
//	迭代器法 
	vector<int>::reverse_iterator it;//使用迭代器
	for(it=v.rbegin();it!=v.rend();it++){
    
		cout<<*it<<' ';
	} 
	cout<<endl;
	
//	下标遍历法
	for(int i=v.size()-1;i>=0;i--){
    
		cout<<v[i]<<' ';
	} 
} 

运行结果:

2 3 1
2 3 1

foreach虽然简单易用,但是不支持逆序遍历

有小伙伴发现dev不能编译部分代码,那是因为dev还未支持c++11,可以看这篇文章解决
dev使用c++11教程

是不是很简单呢?

刚接触肯定会觉得难,多些做题多些用,熟悉了就容易了,兄弟萌,加油!!!

文章尚有不足,欢迎大牛们指正

感谢观看,点个赞吧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_52115456/article/details/126024253

智能推荐

【Echarts】Echarts给title添加背景图片_echarts title设置背景-程序员宅基地

文章浏览阅读2.4k次,点赞3次,收藏7次。Echatrs给标题添加背景图片_echarts title设置背景

毕设分享|基于51单片机控制的开关电源设计_51单片机供电电路设计-程序员宅基地

文章浏览阅读1.5k次。电源技术是一种应用功率半导体器件,综合电力变换技术、现代电子技术、自动控制技术的多学科的边缘交叉技术。随着科学技术的发展,电源技术又与现代控制理论、材料科学、电机工程、微电子技术等许多领域密切相关。目前电源技术已逐步发展成为一门多学科互相渗透的综合性技术学科。他对现代通讯、电子仪器、计算机、工业自动化、电力工程、国防及某些高新技术提供高质量、高效率、高可靠性的电源起着关键作用。_51单片机供电电路设计

linux4.15之后国家码使用(CRDA)_linux5 regdb-程序员宅基地

文章浏览阅读2.7k次。(1)需要开启以下宏:CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=yCONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y(2)下载regulatory.dbandregulatory.db.p7s. Place them into/lib/firmware/directory.Index of /pub/software/network/wireless-regdb/https://mirrors.edge.kernel...._linux5 regdb

sqlite创建索引最佳实践-程序员宅基地

文章浏览阅读2.2k次。创建索引可以使 SQLite 数据库更快地执行查询,但是也会增加插入、更新和删除的时间。因此,在创建索引时,应该考虑查询和修改操作的平衡。在创建索引时,有几点可以遵循的最佳实践:使用 WHERE 子句中经常出现的列创建索引。使用列上的唯一约束或主键创建唯一索引。这有助于防止重复的值。避免使用过于长的索引,因为这会增加存储和维护索引的成本。如果表中有大量的 INSERT、UPDAT..._sqlite 创建索引

%d输出float类型,%f输出int类型_int型能用%f输出吗-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏22次。// 输出格式与类型不一致,输出结果实际上与存储有关 // 1.int以%f格式输出,结果一般为0.000000 // 2.long long 类型的很大的数,用printf(“%f”)打印出来可能为一个小数; // 3.double、float以%d格式输出(输出时,float会转化为double存储形式;%d取低32位) // (1)结果一般为绝对值很大的数(当浮点数不能精确表示时,低32位不为0) // _int型能用%f输出吗

目标检测标注数据的检查和可视化_目标标注信息统计可视化-程序员宅基地

文章浏览阅读4.6k次。标注数据是一件十分枯燥的重复性工作。在标注数据时,有时因为数据量大,类别多,会出现错标、误标的情况,这时就需要对标注数据进行检查并且修改。_目标标注信息统计可视化

随便推点

6-1单链表逆转(C语言)_给定存储若干整数的单链表,实现单链表逆转c-程序员宅基地

文章浏览阅读571次。6-1单链表逆转(C语言)本题要求实现一个函数,将给定的单链表逆转。函数接口定义List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */L是给定单链表,函数R_给定存储若干整数的单链表,实现单链表逆转c

关于GEE导出数据时 含空值的栅格图像_selfmask-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏25次。GEE提供的卫星数据大多数是有丢失的,若不加操作直接导出为tif,matlab读出来的矩阵该是空值的都是nan,然而arcgis并不能识别空值为nodata,导致制图非常难受。加上unmask函数可以让空值变为某个数字,这里设为-9999,方便后续处理。selfMask()则可以将图像的负值都判定为空。Export.image.toDrive({ image: xinjiang_CH4_anomaly.unmask(-9999), description: 'xinjiang_ch4_anom_selfmask

jmeter聚个报告怎么看qps_jmeter 聚合报告参数详解及TPS 解析-程序员宅基地

文章浏览阅读2.1k次。1、获得TPS插件https://www.cnblogs.com/beginner-boy/p/7806220.html 参见,已保存百度云盘2、添加后,记得使用调度器——每秒50个并发,持续60秒,观察TPS3、TPS,执行一次事务(包括请求、请求服务器、等待服务器返回等等,比如一个TPS事务,可能触发3个QPS请求)PS:一秒钟处理的事务数。TPS值越大,一秒钟处理的事务数就越多,说明处理速..._jmeter查看qps

浙大 PAT 甲级 1077 Kuchiguse_pat甲级可以用翻译吗-程序员宅基地

文章浏览阅读135次。读题目真是要笑死我了…太不正经了。很简单的20分~将题意翻译成代码即可。#include<iostream>#include<string>using namespace std;int main(){ int N; scanf("%d", &N); getchar(); string base; getlin..._pat甲级可以用翻译吗

centos7 svn服务器搭建_svn co authentication方法-程序员宅基地

文章浏览阅读1.5k次。基于centos7 的svn服务器配置_svn co authentication方法

capilot激活时遇到Sign in failed: Error: network error_sign in failed. reason: could not log in with devi-程序员宅基地

文章浏览阅读922次。capilot激活遇到问题,Sign in failed: Error: network error_sign in failed. reason: could not log in with device flow on cocopilot.org:

推荐文章

热门文章

相关标签