vector(向量)是c++中的一个模板类,具体来说是一个不定长数组,并且类里还封装了一些常规操作。
如何定义:vector使用时需要头文件#include <vector> ,因为它是一个模板类,所以支持多种数据类型,包括自己定义的类。
vector<int> a(10,1); //这个容器里存放了十个一,若没有那个1,则默认是十个0
vector<int>b; //空的int容器
vector<int>b(a); //用a来初始化b 或者这样写vector<int>b(a.begin(),a.end());
vector<string>c(10,"c++"); //十个c++字符串
还可以用数组初始化:
int array[ ]={1, 2, 3, 4, 5, 6, 7}; vector<int> vec(array, array+7);
容器之间的赋值:
- =直接赋值:
vector<int> a(10,1); vector<int>b; b=a;
- assign()函数赋值
vector<int> a(5,20); vector<int> b; b.assign(a.begin(),a.end());
- for循环赋值
vector<int> a(5,20); vector<int> b(5,10); b.clear(); for(vector<int>::iterator i=a.begin();i!=a.end();i++) { b.push_back(*i); } #vector<int>::iterator i是迭代器类似于指针 下面会说到
vector的一些操作方法:
vec1.push_back(100); //添加元素
int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
cout<<vec1[0]<<endl; //取得第一个元素
vec1.insert(vec1.end(),5,3); //从vec1.back位置插入5个值为3的元素
vec1.pop_back(); //删除末尾元素
vec1.erase(迭代器1,迭代器2); //删除之间的元素,其他元素前移
cout<<(vec1==vec2)?true:false; //判断是否相等==、!=、>=、<=...
vector<int>::iterator iter = vec1.begin(); //获取迭代器首地址
vector<int>::const_iterator c_iter = vec1.begin(); //获取const类型迭代器
vec1.clear(); //清空元素
迭代器:
这里解释一下上面的 vector<int>::iterator i,它定义了vector的迭代器 i;迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,a.begin()和=a.end()都返回的是迭代器类型,类似于数组中的指针,同样可以使用*进行解引用。(其实a.end()返回的是vector最后一个地址再加一,有点类似于sort()的第二个参数)。
类似于const char* 和char* const的区别, vector<int>::const_iterator 和 const vector<int>::iterator的也有类似的区别,前者不能修改元素,后者不能修改指针。
另外,vector还可以使用下标操作,例如上面代码中b[0]这样的表述。它是vector的特有访问方法,一般容器只能通过迭代器访问。还有就是必须是已经存在的元素才能够用下标操作符进行索引。
例题:木块问题(UVa 101)
从左到右总共有n个木块,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置。现对这些木块进行操作,操作分为四种。
1、move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;
2、move a over b:把a上的木块放回各自的原位,再把a放到含b的堆上;
3、pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;
4、pile a over b:把a连同a上木块移到含b的堆上。
当输入quit时,结束操作并输出0~n-1的位置上的木块情况