C++杂谈(二)初识vector容器与迭代器
教科书中失踪的vector
很奇怪的一件事情,在当时学习C++的时候,老师并没有讲授容器的内容,当时参考的谭浩强老师的红皮C++也没有这个内容,不知为何。后来再学C++,发现容器是一个很重要的概念,在C++primer中,大量使用了vector容器,在很多在线编程网站的题目中,也使用了vector<int>取代了整形数组。同样的,教材中也没有出现迭代器。
vector比数组好在哪?
vector和数组都是存储相同类型对象的容器。vector的大小变,数组大小固定不变,所以vector更加灵活。在不确定元素个数的时候,vector更适合。当元素个数确定时,可以使用数组。对于某些情况下,数组的性能可能更好一些。
使用vector
vector是标准库类型,需要包含适当的头文件。
#include<vector>
using std::vetor;
vector是类模板而非类型,必须实例化。
vector<int>
初始化vector
vector<T> v1;//空vector vector<T> v1(v2);//v1是v2副本 vector<T> v2=v1;//与上等价 vector<T> v3(n,val);//n个元素,都是val vector<T> v4(n);//n个元素,执行值初始化 vector<T> v5{a,b,c,.....}//列表初始化 vector<T> v5={a,b,c,...}//遇上等价
对vector操作
大多vector操作和string很相似
v.push_back(t);//追加元素到尾端 v.size();//返回元素个数 v.empty();//返回是否是空 v[n];//下标访问 //以及 ==,!=,>,>=,<,<=
注意:
- 不能用下标添加元素
- 只能对已存在的元素进行下标操作,否则会导致缓冲区溢出(buffer overflow,用下标访问不存在的元素)
使用迭代器
迭代器iterator的作用类似于指针,对对象间接访问。获取迭代器使用begin()与end(),注意,end返回容器尾部的下一位置。
获得迭代器与迭代器类型
auto b=v.begin();//auto是c++11的新类型说明符 vector<int>::iterator it1;//it是读写的迭代器,每个容器定义了一个迭代器 vector<int>::const_iterator it2;//it2只能读,不能写
迭代器运算
*it;//返回引用 it->mem//等价(*it).mem //也有++,--,==,!=; //有+n,-n,+=,-=; it1-it2;//返回类型difference_type //有>,<,>=,<=
迭代器的作用于指针类似,操作也类型于指针。
一个使用vctor与迭代器的二分搜索
vector<int>::const_iterator binarySearch(vector<int> &arr, int target) { vector<int>::const_iterator begin = arr.begin(); vector<int>::const_iterator end = arr.end(); vector<int>::const_iterator mid = begin + (end - begin) / 2; while (mid != end&&*mid != target) { if (target < *mid) end = mid; else begin = mid + 1; mid = begin + (end - begin) / 2; } return mid; }
ps.看到有一种说法,迭代器是一种广义指针,也是有其道理的。