C++ STL之vector详解

本文详细介绍了C++标准库中的vector容器,包括其作为动态数组的特性、初始化方式、元素访问及常用方法函数。通过实例展示了如何添加、删除和修改vector中的数据,并探讨了排序、迭代器访问等关键知识点,为理解和使用C++ vector提供了全面指导。
摘要由CSDN通过智能技术生成

1.1 介绍

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。

头文件

#include < vector >

初始化:

//初始化
//方式一:初始化一维可变长数组
vector<int>num; //定义了一个名为num的存int数据的一维数组
vector<double>num;//定义了一个名为num的存double数据的一维数组
vector<node>num;//node是结构体类型

//方式二:初始化二维可变长数组
vector<int>num[5];//定义可变长二维数组
//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素
//第一维固定长度为5,第二维长度可以改变

//方式三:初始化二维均可变长数组
vector<vectot<int> >num;//定义一个行和列均可变的二维数组

简单访问:

//方式一:单个访问,假设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<<" ";

初始化技巧:

//1.附加长度
vector<int >v(n);//定义一个长度为n的数组,动态定义
//2.附加长度和初始值
vector<int>v(n,0);//所有的元素均为0

1.2 方法函数

知道了如何定义初始化可变数组,下面就需要知道如何添加,删除,修改数据。
相关方法函数如下:
c指定为数组名称

代码含义
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()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均是如此

以上 O(n),O(1)说的是时间复杂度

1.3 注意点

1.3.a 排序
使用sort排序要: sort(c.begin(),c.end());

对所有元素进行排序,如果要对指定区间进行排序,可以对sort()里面的参数进行加减改动。

1.3.b 访问
数组访问:

上面有简单的访问演示,下面进行扩充并复习

下标法: 和普通数组一样
注意:一维数组的下标是从0到v.size()-1,访问之外的数可能会出错

迭代器法: 类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样,可以根据代码进行理解(附有注释)。

代码如下:

vector<int>vi; //定义一个vi数组
vector<int>::iterator it = vi.begin();//声明一个迭代器指向vi的初始位置

vector数组访问相关代码:

1.3.1.下标访问:

//添加元素
for(int i=0;i<5;i++)
	vi.push_back(i);
	
//下标访问 
for(int i=0;i<5;i++)
	cout<<vi[i]<<" ";
cout<<"\n";

1.3.2.迭代器访问:

//迭代器访问
vector<int>::iterator it;   
//相当于声明了一个迭代器类型的变量it
//通俗来说就是声明了一个指针变量

//方式一:
vector<int>::iterator it=vi.begin(); 
for(int i=0;i<5;i++)
	cout<<*(it+i)<<" ";
cout<<"\n";

//方式二:
vector<int>::iterator it;
for(it=vi.begin(); it != vi.end();it++)
	cout<<*it<<" ";
//vi.end()指向尾元素地址的下一个地址

1.3.3.智能指针:

只能遍历完数组,如果要指定的内容进行遍历,需要另选方法。
auto 能够自动识别类型。

vector<int>v;
v.push_back(12);
v.push_back(241);
for( auto i : v) 
	cout<<i<<" "; // 12 241

综上

  1. vi[i] 和 *(vi.begin() + i) 等价
  2. 说明:只有vector和string的stl容器支持*(it+i)的元素访问 string的讲解在后续章节会有讲述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值