C++STL vector的所有用法总结

前言

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。

一.常用操作

头文件 #include<vector>
c.clear()           					//移除容器中所有数据。
c.empty()           					//判断容器是否为空。
c.erase(c.begin()+pos)      			//删除pos位置(从0计数)的数据
c.erase(c.begin()+beg,c.begin()+end)    //删除[beg,end)区间(从0计数)的数据
c.front()          						//传回第一个数据。
c.insert(c.begin()+pos,elem)  			//在pos位置(从0计数)插入一个elem拷贝
c.insert(c.begin()+pos,4,e)			//在pos位置(从0计数)插入4个元素,值都是e
c.pop_back()        					//删除最后一个数据。
c.push_back(elem)  						//在尾部加入一个数据。
c.size()            					//回容器中实际数据的个数。
c.begin()           					//返回指向容器第一个元素的迭代器
c.end()             					//返回指向容器最后一个元素的迭代器
c.resize(num)       					//重新设置该容器的大小,用途会在更多用法详解
c.reserve(100)      					//把a的容量扩充到100个,用途会在更多用法详解
c.swap(s)           					//整体交换集合s和c中的值
c = d									//把d中的元素复制到c中
c == d              					//比较集合c和d是否相等

常用的包含在头文件#include<algorithm>中的两个函数

reverse(c.begin(),c.end());//反转vector中元素 

sort(c.begin(),c.end());//对vector中元素进行排序,默认从小到大
						//如果vector<>中是其他数据类型,则需要自定义排序,自定义排序在用法详细中
find(c.begin(),c.end(),e); //在a中的从c.begin()(包括它)到c.end()(不包括它)的元素中查找e,返回值是目标元素的迭代器,找不到时返回值为迭代器结尾

二.用法详细

1.初始化方法:

1.//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定
vector<int> a(10);

2//定义具有10个整型元素的向量,其初值全为1
vector<int>a(10,1);

3.//用向量b给向量a赋值,a的值完全等于b的值
vector<int> a(b);

4.//将向量b中从0-2(共三个)的元素赋值给a,a的类型
vector<int> a(b.begin(),b.end()+3);

5.//从数组中获得初值
int b[6] = {1,2,3,4,5,6};
vector<int> a(b,b+6);

以上<>中的int可用其他数据类型代替,例如:

struct node		//自定义的数据类型
{
	int a;
	string b;
};

vector<node> n; //相当于node类型的数组

2.元素的输入及访问

元素的输入和访问可以像操作普通的数组那样, 用cin>>进行输入, cout<<a[n]这样进行输出:

#include<iostream>
#include<vector>
using namespace std ;
int main()
{
    vector<int> a(10, 0) ;      //大小为10初值为0的向量a
    //对其中部分元素进行输入
    cin >>a[2] ;
    cin >>a[5] ;
    cin >>a[6] ;
    //全部输出
    for(int i=0; i<a.size(); i++)
        cout<<a[i]<<" " ;
    return 0 ;
}

另外一种输出方法:

//全部输出
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
    cout<<*t<<" " ;

3.二维向量

与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

vector<vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量

在这里, 实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

对二维向量的简单操作:

#include<iostream>
#include<vector>
using namespace std ;
int main()
{
    vector< vector<int> > b(10, vector<int>(5, 0)) ;
    //对部分数据进行输入
    cin>>b[1][1] ;
    cin>>b[2][2] ;
    cin>>b[3][3];
    //全部输出
    int m, n ;
    for(m=0; m<b.size(); m++)           //b.size()获取行向量的大小
    {
        for(n=0; n<b[m].size(); n++)    //获取向量中具体每个向量的大小
            cout<<b[m][n]<<" " ;
        cout<<"\n" ;
    }
    return 0;
}

3.重写比较器

#include<iostream>
#include<algorithm>
#include<random>
#include <ctime>
using namespace std;

bool cmp(const int &a,const int &b){	//自定义的比较器,从大到小排列
    return a>b;
}

int main()
{
    srand((int)time(0));				//设置随机种子,有兴趣可以自行百度
    vector<int> a;
    for(int i = 0; i < 10; i++){
        int x = rand()%10+1;			//生成1~10之间的随机数
        a.push_back(x);					//把x从尾部塞到a中
    }
    for(int i = 0; i < 10; i++){
        cout << a[i] << ' ';
    } cout << endl;
    sort(a.begin(),a.end(),cmp);		//排序
    for(int i = 0; i < 10; i++){
        cout << a[i] << ' ';
    } cout << endl;
}

更多用法

c.at(i) == c[i] //访问c中下标为i的元素
c.resize(num)  //将c中元素个数变成num个,多删,少补,其值为0
c.resize(num,e)  //将c中元素个数变成num个,多删,少补,其值为e
c.reserve(num)  //只扩充容量,不改变元素个数

初始化时vector中的容量是固定的,用类似 c[i] 访问其中元素时,如果i超过其容量时会报错,reserveresize可以让你直接通过下标访问其中元素,reserve只扩容不补值,但是可以直接访问大于其自身元素个数之外的元素,其值为0

错误示例:

vector<int> a;
for(int i=0;i<10;i++)
    a[i]=i;

这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素,而现在的a[i]还是空的对象。

如果对您有帮助的的话,欢迎点赞哦~谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值