[C++STL] vector 可变长数组 用法详解

本文详细介绍了C++标准库中的vector容器,包括初始化、尾部插入弹出、随机访问、容器大小设置与查询、遍历方法以及一些不常用操作如赋值、插入删除和容器清空。通过示例代码展示了vector的各种用法,帮助读者深入理解并掌握vector的使用。

前言

vector是一个常用的C++标准库类。
它可以和数组一样,在常数时间内实现随机访问。
不仅如此,vector类中封装的一些方法(如尾部快速插入,判空),使得它更加实用、强大。

索引

vector
    一、初始化
    二、(尾部)插入 弹出
    三、随机访问
    四、容器大小
        1. 大小设置
        2. 大小查询
    五、容器遍历
        1.使用迭代器遍历容器
        2.使用下标遍历容器
    六、其他(不常用)
        1. 赋值
        2. (指定位置)插入 删除
        3. 容器清空


vector

vector定义在vector头文件中。
实用之前需要手动包含头文件.

#include<vector>

一、初始化

语法
  • vector vec :初始化一个存放type类型数据的vector空对象vec
  • vector vec1(vec2):使用vector对象vec2初始化对象vec1
  • vector vec(beg,end):使用[beg,end)地址区间内的元素初始化对象vecbegend可以是指针,或者迭代器。
  • vector vec(size):初始化一个元素个数为size的对象vec
  • vector vec(size,t):初始化一个元素个数为·size·,元素值为t的对象vec
代码示例
#include<vector>
vector<int> v1;
vector<int> v2(v1);
vector<int> v3(v1.begin(),v1.end());
vector<int> v4(5);
vector<int> v5(5,1);

二、(尾部)插入 弹出

语法
  • vector.push_back(t):在容器的尾部插入元素t
  • vector.pop_back():弹出(即删除)容器尾部元素。
代码示例
#include<vector>
using namespace std;
int main(){
	vector<int> v1;
	v1.push_back(12);	// 在尾部插入12
	v1.pop_back();		// 弹出尾部元素
	return 0;
}

三、随机访问

语法
  • v[idx]:使用[]运算符进行随机访问(类似于对数组元素进行访问)
  • v.at(idx):使用at方法进行随机访问,放回指定元素的引用。
    这两个方法都可以对vector对象进行随机访问。
  • v.front():返回对象v的首个元素的常引用。
  • v.back():返回对象v的最后一个元素的常引用。

ps:[]运算符和at方法都可以实现随机访问,不同的是at方法在访问时会进行访问检查,当访问超出容器范围时,会抛出out_of_range异常。

代码示例
#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> a;
	a.push_back(10);
	a.push_back(11);
	a.push_back(12);
	a.push_back(13);
	cout << a[0] << endl;
	a[0] ++;
	cout << a[0] << endl;
	cout << "========" << endl;
	cout << a.at(1) << endl;
	a.at(1) = 0;
	cout << a.at(1) << endl;
	cout << "========" << endl;
	cout << a.front() << endl;
	cout << "========" << endl;
	cout << a.back() << endl;
	return 0;
} 

输出

10
11
========
11
0
========
11
========
13

四、容器大小

1. 大小设置

  • v.resize(h,[val]):设置vector的长度为h
    - 如果h小于原本vector容器长度,那么从第h个元素开始往后的元素都将被销毁。
    - 如果h大于原本的vector容器长度,那么会从原本vector容器后面补全h个元素(如果指定了值val,那么会用val初始化新增加的值)。
    - 如果h同时大于capacity,那么会自动完成内存分配。
  • v.reserve(h) 改变当前vecotr所分配空间的大小。
    • 如果h的值大于当前capacity的大小,则会将容器内存分配至h
    • 如果h的值不大于当前capacity的大小,则不做出操作。

2. 大小查询

  • v.size():返回对象v当前元素个数
  • v.max_size():返回容器最大可能的分配到的空间大小
  • v.capacity():返回容器当前已分配到的空间大小(如果元素过多,将会自动为容器分配更多的空间
  • v.empty():返回一个布尔值,表示容器是否为空。

欢迎阅读我的另一篇文章,增加对这几个函数的理解和区分→ vector size max_size capacity区别与理解

代码示例
#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.resize(11);
	v.reserve(1123);
	cout << "size:" << v.size() << endl;
	cout << "capacity:" << v.capacity() << endl;
	cout << "max_size:" << v.max_size() << endl;
	return 0;
} 

输出

size:11
capacity:1123
max_size:536870911

五、容器遍历

vector容器遍历一般有两种办法

1.使用迭代器遍历容器
#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for(vector<int>::iterator p = v.begin();p != v.end();p++)	// 顺序遍历 
		cout << *p << " ";
	cout << endl;
	for(vector<int>::reverse_iterator p = v.rbegin();p != v.rend();p++)	// 倒序遍历 
		cout << *p << " ";
	cout << endl;
	return 0;
} 

输出

1 2 3 4 
4 3 2 1 

ps:可以将vector<int>::iterator简写为auto,即让编译器自动识别变量类型。

特别注意:

逆序迭代器vector<int>::reverse_iteratorC++11新特性,在C++98中不存在。

2.使用下标遍历容器
#include<vector>
#include<iostream>
using namespace std;
int main(){
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	for(int i = 0;i < (signed)v.size();i++)	// 顺序遍历 
		cout << v[i] << " ";
	cout << endl; 
	for(int i = v.size() - 1;i >= 0;i--)
		cout << v[i] << " ";
	cout << endl;
	return 0;
} 

输出

1 2 3 4 
4 3 2 1 

使用下标进行遍历,这种方式和对数组进行遍历一样,所以更容易让人接受。
但使用下标遍历,可能会有潜在的效率问题。欢迎阅读我的另外一篇文章,进行深入了解→size复杂度问题

六、其他(不常用)

1. 赋值

语法
  • v.aasign(beg,end):将[beg,end)地址区间的值赋给vector对象v
  • v.assign(n,val):将n个值val赋值给对象v
    调用该方法后,对象v原本的数据都会被销毁。
    当且仅当赋值后所需的内存大于容器原有内存时,系统会自动为容器重新分配内存。
代码示例
#include<iostream>
#include<vector>
using namespace std;
int main(){
	vector<int> a,b;
	a.push_back(5);
	a.push_back(3);
	cout << "赋值前:";
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	a.assign(5,1);
	cout << "赋值后:";
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	
	b.push_back(10);
	b.push_back(12);
	b.push_back(48);
	cout << "使用b赋值后:";
	a.assign(b.begin(),b.end());
	for(auto p = a.begin();p != a.end();p++)
		cout << *p << " ";
	cout << endl;
	return 0;
} 

输出

赋值前:5 3
赋值后:1 1 1 1 1
使用b赋值后:10 12 48

2. (指定位置)插入 删除

  • v.insert(ite,val):将值val插入到对象v的迭代器ite所对应的位置。
  • v.insert(ite,n,val):将n个值val插入到迭代器ite所对应的位置。
  • v.insert(ite,beg,end):将区间[beg,end)中的值插入到迭代器ite的位置。
  • v.erase(ite):删除对象v中迭代器ite所对应位置的值。
  • v.erase(beg,end):删除对象v中区间[beg,end)位置的值。

由于inserterase的操作与迭代器关系较为紧密,且通常与find等其他函数结合才能发挥出其实际作用,因此在此不做深入探究。

如果您想要对vector的inserterase方法深入了解,欢迎关注我后续的文章→

3. 容器清空

  • v.clear():清空对象。
    ps:调用clear方法后,对象的size()变为0——即清空了元素,元素个数为0。
    capacity()不变——即不会重新进行内存分配。

参考资料

vector官方文档


原创不易,感谢您的支持。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值