C++之vector
C++之vector
前言
在C++中,vector是一个十分有用的容器。
作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
基本操作
1)头文件
#include<vector>
2)创建vector对象
vector<int> vec;
3)尾部插入元素
vec.push_back(a);
4)尾部删除元素
vec.pop_back();
5)向向量中添加元素
vector<int> a;
for(int i=0;i<10;i++)
a.push_back(i);
6)使用下标访问元素
cout<<vec[0]<<endl; //记住下标是从0开始的
7)访问首尾元素
vec.begin() 返回一个迭代器,它指向容器vec的第一个元素
vec.end() 返回一个迭代器,它指向容器vec的最后一个元素的下一个位置
vec.front()返回容器vec的第一个元素的引用
vec.back()返回容器vec的最后元素的引用
8)使用迭代器访问元素
vector<int>::iterator it;
for(it=vec.begin(); it!=vec.end(); it++)
cout<<*it<<endl;
9)插入元素
vec.insert(vec.begin()+i, a); //在第i+1个元素前面插入a
vec.insert(vec.begin()+1,5); //在vec的第1个元素(从第0个算起)的位置插入数值5,如vec为1,2,3,4,插入元素后为1,5,2,3,4
vec.insert(vec.begin()+1,3,5);//在vec的第1个元素(从第0个算起)的位置插入3个数,其值都为5
vec.insert(vec.begin()+1,b+3,b+6);//b为数组,在vec的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
10)删除元素
vec.erase(vec.begin()+2); //删除第3个元素
vec.erase(vec.begin()+1,vec.begin()+3); //删除vec中第1个(从第0个算起)到第2个元素,也就是说删除的元素从vec.begin()+1算起(包括它)一直到vec.begin()+3(不包括它)
vec.erase(vec.begin()+i, vec.end()+j); //删除区间[i,j-1];区间从0开始
11)向量大小
vec.size();
12)清空
vec.clear();
13)判断是否为空
vec.empty(); //判断vec是否为空,空则返回ture,不空则返回false
14)交换向量
vec.swap(b); //b为向量,将vec中的元素和b中的元素进行整体性交换
15)赋值
vec.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给vec
vec.assign(4,2); //vec只含4个元素,且每个元素为2
重要算法
需包含头文件 #include<algorithm>
1)sort(vec.begin(),vec.end());
对vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素进行从小到大排列
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp);这样就降序排序。
2)reverse(vec.begin(),vec.end());
对a中的从vec.begin()(包括它)到vec.end()(不包括它)的元素倒置,但不排列,如vec中元素为1,3,2,4,倒置后为4,2,3,1。
3)copy(vec.begin(),vec.end(),b.begin()+1);
把vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素。
4)find(vec.begin(),vec.end(),10);
在vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置。
vector构建动态二维数组
#include <vector>
//=============================方法1=================================================
int **p = new int*[10]; //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i)
{
p[i] = new int[5]; //这样就构成10*5的数组
}
//=============================方法2=================================================
int i, j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
array[i].resize(3); //这样就构成5*3的数组
for (i = 0; i < array.size(); i++) //赋值
{
for (j = 0; j < array[0].size(); j++)
{
array[i][j] = (i + 1)*(j + 1);
}
}