前言
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超过其容量时会报错,reserve和resize可以让你直接通过下标访问其中元素,reserve只扩容不补值,但是可以直接访问大于其自身元素个数之外的元素,其值为0;
错误示例:
vector<int> a;
for(int i=0;i<10;i++)
a[i]=i;
这种做法以及类似的做法都是错误的。下标只能用于获取已存在的元素,而现在的a[i]还是空的对象。
如果对您有帮助的的话,欢迎点赞哦~谢谢