迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。
迭代器的类型及定义
迭代器的类型有iterator和const_iterator.
const_iterator 能读取但不能修改它所指的元素值。相反,iterator的对象可读可写。
vector<int>::iterator it; //it能读写vector<int>的元素
string::iterator it2; //it2能读写string对象中的字符
vector<int>::const_iterator it3; //it3只能读元素,不能写元素
string::const_iterator it4; //it4只能读字符,不能写字符
如果vector对象或string对象是一个常量,只能使用const_iterator;如果vector对象或string对象不是常量,那么既能使用iterator也能使用const_iterator。
begin和end运算符
begin成员负责返回指向第一个元素(或第一个字符)的迭代器。end成员负责指向尾元素(或尾字符)的下一个位置,该迭代器没什么实际含义,仅是个标记而已。
begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator;
vector<int> v;
const vector<int> cv;
auto it1 = v.begin(); //it1的类型是vector<int>::iterator
auto it2 = cv.begin() //it2的类型是vector<int>::const_iterator
为了便于专门得到const_iterator类型的返回值,C++11新标准引入了两个新函数,分别为cbegin和cend;使用这两个新函数,不论对象本身是否是常量,返回值都是const_iterator。
迭代器的运算符
因为end返回的迭代器并不实际指示某个元素,所以不能对其进行递增或解引用的操作。
迭代器的运算
string和vector的迭代器提供了更多额外的运算符,一方面可使的迭代器的每次移动跨过多个元素,另外也支持迭代器进行关系运算。
迭代器的算术运算
只要两个迭代器指向的是同一个容器中的元素或尾元素的下一个位置,就能将其相减,所得结果是两个迭代器的距离。该距离的类型是名为difference_type的带符号整型数。
下面的程序是使用迭代器完成了二分搜索:
//t必须是有序的
//beg和 end表示我们的搜索范围
auto beg = t.begin();
auto end = t.ens();
auto mid = beg + (end - beg)/2;
//sought为需要找的元素
while (mid != end && *mid != sought)
{
if (sought < *mid)
end = mid;
else
beg = mid+1;
mid = beg +(end - beg)/2; //更新中间点
}
某些对vector对象的操作会使迭代器
谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。