c++中vector的常见用法与竞赛做题奇技淫巧总结(新手篇)

介绍:在C++中vector作为一种容器与string类一样 vector 类是随标准 C++引入的标准库的一部分,使用时需引用头文件 #include < vector >。vector 是同一种类型的对象的集合。

一.vector与静态数组的异同.

相同点:

vector和静态数组都只能对同一类型的数据进行储存。
②两者储存是连续的,可也进行随机访问。
③都可用下标进行处理。

不同点:

vector的长度一般不固定,可以根据数据的插入和删除重新构造容器容量,数据的而数组的长度已经固定,因此vector也避免数组越界等问题。但vector数组也存在一定的弊端。
vector可也通过size(),empty()来判断容器的大小或者是否为空,而数组只能通过 sizeof()和strlen()来判断。
③可将vector视为动态数组。相比数组,在不知道数据规模时可以使用vector来节约空间,在竞赛和刷题中,如果空间紧张,可使用STL的vector建立动态数组,不仅节约空间,而且不容易出错。

注意:若要创建非空的vector对象,就必须初始化元素的值。且vector与其他STL容器都必须访问已存在的元素,否则会出现段错误。

二.vector的常用操作

1.初始化

vector<int> v;    
vector<int> v(10);
vector<int> v(10,1);

第一种方式默认初始化vector为空, size为0,表明容器中没有元素,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。

第二种方式默认值初始化,v中将包含10个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此v被初始化为包含100。当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。

第三种方式与第二种相同,只是初始化值变成了1

vector<int> v(v1);
vector<int> v(v1.begin(),v1.begin()+5);
int a[5]={1,2,3,4,5};   vector<int> v(a,a+7);
vector<int> v={1,2,3,4,5,6,7};

第一种是以vector< int >v1的全部元素整体复制性建立v
第二种是以vector< int >v1的前5个元素即{1,2,3,4,5}来建立v
这里要注意这种写法只适用于相同数据类型的vector。

vector<string> v(10,"fuck"); 

这里是string类型的vector,容器内初始化了10个“fuck”字符串。

struct node{int x,y};  
vector<node> v;

类似的定义结构体数组,这里可以用v来存储坐标。

vector<int> v[MAXN]

还可以定义多维数组,例如上文定义了一个二维数组,他的第一维是固定的MAXN,而第二位贼是动态的。用这个方式可以实现图的邻接矩阵。

2.赋值和插入元素

for(int i=0;i<3;i++) v.push_back(i);

从尾部插入0,1,2。vector的下标也是从0开始,所以v[0]=0,v[1]=1,v[2]=2。

vector<int> v(10)
for(int i=1;i<=3;i++) v[i]=i+1;

类数组方式建立的vector因为已经默认值初始化,可以直接对范围内的元素直接赋值,这里v[0]=0,v[1]=2,v[2]=3,v[3]=4,v[4]=0,v[5]=0…

v.insert(v.end(),10,5);               在尾部插入10个值为5的元素
v.insert(v.begin()+i,k);              是在第i个元素前面插入k。

3.删除与清空

v.pop_back();                         删除末尾元素
v.erase(v.begin()+i,v.begin()+j);     删除区间[i,j-1]的元素
v.erase(v.begin()+2);                 删除第3个元素
v.clear();                            清空

4.其他重要操作

sort(v.begin(),v.end());sort()函数从小到大进行排序
reverse(v.begin(),v.end());reverse()函数翻转数组
v.size()                              返回容器的大小
v.empty()                             判断容器是否为空,为空返回0,不为空则为1
cout<<v[0];                           打印第一个元素
cout<<v[v.size()]                     打印最后一个元素
lower_bound(v.begin(),v.end(),a)      在有序数组中返回第一个大于等于a的元素的下标,返回值的是地址
upper_bound(v.begin(),v.end(),a)-v.begin()	  在有序数组中返回第一个大于a的元素的下标,这里通过减去首地址,得到了下标位置
vector<int>::iterator it;			  定义迭代器方便得到元素值,相当于指针
it=upper_bound(v.begin,v.end(),a)     
cout<<(*it)                           这里返回的是第一个大于a的元素的值

三.vector的巧妙运用

由于C++中许多存在许多内置函数,使得vector操作方便高效。其作为动态数组在节约空间灵活插入与删除改变数组序列的同时,可以模拟动态变化,在某些数组序列问题中可以起到模拟,存放,保存结果等作用。我会在接下来的时间里不断的更新vector妙用。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值