vector容器介绍
vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。
在局部函数中开vector数组,是在堆空间里面开的,与开全局变量比较类似,所以经常见到在局部函数中开大容量数组。
- 头文件
#include < vector >
-
初始化
-
一维初始化
vector<int>num; //定义了一个名为num的存int数据的一维数组
vector<double>num;//定义了一个名为num的存double数据的一维数组
vector<node>num;//node是结构体类型
指定长度和初始值的初始化
vector<int> v(n);//定义一个长度为n的数组,动态定义
vector<int> v(n,0);//所有的元素均为0
//注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)
//就不能使用push_back()操作了(此操作见下文)
初始化中有多个元素
vector<int> a{1, 2, 3, 4, 5};// 数组a中有五个元素
拷贝初始化
vector<int> a(n + 1, 0);
vector<int> b(a);//两个数组中的类型必须相同,a和b都是长度为n+1,所有值都为0的数组
- 二维初始化
定义第一维固定长度为5,第二维可变化的二维数组
vector<int>num[5];//定义可变长二维数组
//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素
//第一维固定长度为5,第二维长度可以改变
行列均可变
//初始化二维均可变长数组
vector<vectot<int> >num;//定义一个行和列均可变的二维数组
行列长度均固定 n + 1行 m + 1列初始值为0
vector<vector<int> > a(n + 1, vector<int>(m + 1, 0));
/方式一:单个访问,假设num数组中已经有了5个元素
cout << num[4] << "\n"; //输出第五个数据
//一二维可变数组和普通数组的访问方法一样
//方式二:遍历
for(int i = 0; i < num.size(); i++)
cout << num[i] << " ";//下标范围在[0,num.size()),前开后闭
//方式三:智能指针
for(auto i : num)
cout << i << " ";
代码 | 含义 |
---|---|
c.front() | 返回第一个数据 |
c.pop_back() | 删除最后一个数据 O(1) |
c.push_back(element) | 在尾部加一个数据 O(1) |
c.size() | 返回实际数据个数(unsigned类型) O(1) |
c.clear() | 清除元素个数 O(N),N为元素个数 |
c.resize(n,v) | 改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0 |
c.insert(it,x) | 向任意迭代器it插入一个元素x O(N) |
例:c.insert(c.begin()+2,-1) | 将-1插入c[2]的位置 |
c.erase(first,last) | 删除[first,last)的所有元素 |
c.begin() | 返回首元素的迭代器(通俗来说就是地址) |
c.end() | 返回最后一个元素后一个位置的迭代器(地址) |
c.empty() | 判断是否为空,为空返回真,反之返回假 |
注意: end()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均是如此
1.排序
使用sort排序要: sort(c.begin(),c.end());
对所有元素进行排序,如果要对指定区间进行排序,可以对sort()里面的参数进行加减改动。
2.访问
上面有简单的访问演示,下面进行扩充并复习
下标法: 和普通数组一样
注意:一维数组的下标是从0 00到v . s i z e ( ) − 1 v.size()-1v.size()−1,访问之外的数可能会出错
迭代器法: 类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样,可以根据代码进行理解(附有注释)。
代码如下:
``
vector
vector
vector数组访问相关代码:
$\color{red}{2.1.下标访问:}$
//添加元素
for(int i = 0; i < 5; i++)
vi.push_back(i);
//下标访问
for(int i = 0; i < 5; i++)
cout << vi[i] << " ";
cout << "\n";
$\color{red}{2.2.迭代器访问:}$
//迭代器访问
vector
//相当于声明了一个迭代器类型的变量it
//通俗来说就是声明了一个指针变量
//方式一:
vector
for(int i = 0; i < 5; i++)
cout << *(it + i) << " ";
cout << "\n";
//方式二:
vector
for(it = vi.begin(); it != vi.end();it ++)
cout << *it << " ";
//vi.end()指向尾元素地址的下一个地址
$\color{red}{2.3.智能指针:}$
只能遍历完数组,如果要指定的内容进行遍历,需要另选方法。
auto 能够自动识别类型。
vector
v.push_back(12);
v.push_back(241);
for( auto i : v)
cout << i << " "; // 12 241
综上:
vi[i] 和 *(vi.begin() + i) 等价
说明:只有vector和string的stl容器支持*(it+i)的元素访问
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?