C++ vector
一、概念
vector是C++标准模板库(STL)中的部分内容,它是一个多功能的、能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,能够存放任意类型的动态数组,可以广义上认为是数组的增强版。vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素,vector 也提供了许多的方法来对自身进行操作。元素个数不变时可用数组,经常添加删除时可用vector。vector经常申请释放内存,开销较大,但自身支持的操作也多。编译时,长度已知,用数组;编译时不知长度,用vector或动态数组。vector不是数据类型,vector<int>才是。vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
二、用法
头文件:#include <vector>
然后using namespace std或者std::vector <xxxxxx> xxxxxx
创建对象:
vector<int> a ; //声明一个int型向量a
vector<int> a(10) ; //声明一个长度为10的向量,初始化为0
vector<int> a(10, 3) ; //声明一个长度为10且初始值都为3
vector<int> b(a) ; //声明并用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值
int n[] = {1, 2, 3, 4, 5} ;
vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值
使用时跟数组一样,直接a[x]就行。
三、更多操作
1.迭代器(遍历器)
迭代器表示元素的位置,也是一种数据类型,
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
cout<<*t<<" " ;
*t 为指针的间接访问形式, 意思是访问t所指向的元素值。
2.插入 - insert
a.insert(a.begin(), 1000); //将1000插入到向量a的起始位置前
a.insert(a.begin(), 3, 1000) ; //将1000分别插入到向量元素位置的0-2处(共3个元素)
vector<int> a(5, 1) ;
vector<int> b(10) ;
b.insert(b.begin(), a.begin(), a.end()) ;//将a.begin(), a.end()之间的全部元素插入到b.begin()前
3. 删除 - erase
b.erase(b.begin()) ; //将起始位置的元素删除
b.erase(b.begin(), b.begin()+3) ; //将(b.begin(), b.begin()+3)之间的元素删除
4.尾部插入/添加
a.push_back(elem);//添加
a.pop_back(); //删除容器最后位置处的元素
5.二维向量
vector< vector<int> > b(10, vector<int>(5)); //创建一个10*5的int型二维向量
6.其他常用
c.at(index); 返回指定index位置处的元素
c.begin(); 返回指向容器最开始位置数据的指针
c.end(); 返回指向容器最后一个数据单元的指针+1
c.front(); 返回容器最开始单元数据的引用
c.back(); 返回容器最后一个数据的引用
c.max_size(); 返回容器的最大容量
c.size(); 返回当前容器中实际存放元素的个数
c.resize(); 重新设置vector的容量
c.clear(); 清除所有数据
c.empty(); 判断容器是否为空,若为空返回true,否则返回false
c1.swap(c2); 交换两个容器中的数据
c.insert(p,elem); 在指针p指向的位置插入数据elem,返回指向elem位置的指针
c.insert(p,n,elem); 在位置p插入n个elem数据,无返回值
c.insert(p,begin,end) 在位置p插入在区间[begin,end)的数据,无返回值