C++查漏补缺(第三期)(vector)
vector是stl定义的容器之一容器,所谓容器也就是容纳东西的器物,其实也就是C++标准库对常用的数据结构的实现。vector被翻译成向量,但是我实在不知道这个容器和向量有什么关系,vector其实更像是数组,因为他的存储空间是连续的,但是它相较于数组的优点是可以自动扩充。
它可以容纳绝大多数类型的对象作为元素,但是因为引用不是对象,所以不存在包含引用的vector,同时也可以构造类似二维数组的用法,在早期版本的C++标准中vector若是需要方vector需要写成
vector<vector<int> >//vector<int>后面需要加空格
但是在C++11的新标准则不需要加那个空格了
1.定义初始化vector
vector<T> v1; //v1是一个空vector,它潜在的元素是T类型的,执行默认初始化
vector<T> v2(v1); //v2中包含有v1所有元素的副本
vector<T> v2 = v1; //等价于v2(v1),v2中包含着v1所有元素的副本
vector<T> v3(n, val); //v3包含了n个重复的元素val
vector<T> v4(n); //v4包含了n个重复的执行了初始化的对象
vector<T> v5{ a,b,c,d,e }; //v5包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v6 = { a,b,c,d,e }; //等价于v5
v5是C++11新定义的一种初始化方法,被称作列表初始化。
要想列表初始化vector对象,花括号里的值必须与元素类型相同。
vector<string> v8{10,"Hi"};//v8有10个值为"hi"的元素
v8中10不是string类型,不能作为元素的初始值,编译器会尝试用默认值初始化vector对象。
2.vector对象的操作
v.empty(); //如果v中不含元素则返回真,否则返回假
v.size(); //返回v中元素的个数
v.push_back(t); //在v的尾端插入一个值为t的元素
v[n]; //返回v中第n个位置上元素的引用
v1 = v2; //用v2中的元素的拷贝替换v1中的元素
v1 == v2; //v1和v2相等当且仅当它门的元素数量相同且对应位值得元素值相同
<,<=,>,>= //字典顺序进行比较
大体其实和string差不多
需要注意得是,不能用下标去添加内容,下标只能用来访问已添加得元素;
3.迭代器(iterator)
迭代器这个名字过于高大上了,但是说白了迭代器其实是一个类模板它通过操作符重载将这个类特化为了类似于指针这样的存在。这里我们先引入两个个vector得操作
v.begin(); //返回vector的第一个元素
v.end(); //返回vector的最后一个元素的下一个位置,这个位置本身无任何含义仅作标识
这两个操作的返回值都是迭代器
4.迭代器的操作
*itar; //返回迭代器iter所指元素
iter->mem; //解引用iter并或取
++iter; //令iter指示容器中的下一个元素
--iter; //令iter指示容器中的上一个元素
iter1 == iter2; //判断两个迭代器是否相等,如果两个迭代器指的是同一个元素返回true
iter1 != iter2; //判断两个迭代器是否相等,如果两个迭代器指的不是同一个元素返回true
5.迭代器定义
顺便强调一手迭代器的定义、声明方式,每个容器的迭代器定义是不同的,同一容器不同类型的元素迭代器也不能一样(否则就不知道如何安排内存了),所以迭代器的定义方式为
T<nt>::iterator a; //T是容器类型,nt是容器中元素类型,a是迭代器名字