迭代器简介
除了使用下标来访问 vector 对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator) 。迭代器是一种检查容器内元素并遍历元素的数据类型。
所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素。
迭代器运算符
*iter |
返回迭代器iter所指向的引用 |
iter->mem |
解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem |
++iter |
令iter指示容器的下一个元素 |
--iter |
令iter指示容器的上一个元素 |
iter1==iter2 |
判断两个迭代器是否相等或者不相等,如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之,不相等。 |
迭代器类型
迭代器究竟是什么类型并不知道,实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器类型:
iterator 可以改变 vector 中的元素值。每种容器类型还定义了一种名为 const_iterator 的类型,该类型只能用于读取容器内元素,但不能改变其值。
vector<int>::iterator it; //it能读写元素
vector<int>::const_iterator it2; //it2只能读元素,不能写元素
begin 和 end 操作
每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素, 由 end 操作返回的迭代器指向 vector 的“末端元素的下一个”。 “超出末端迭代器”(off-the-end iterator) 。表明它指向了一个不存在的元素。如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。
auto b=v.begin(),e=v.end;
由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel) 的作用,表示我们已处理完 vector 中所有元素。
begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator,如果对象不是常量,返回iterator:
vector<int> v;
const vector<int> cv;
auto it1=v.bedin(); //it1的类型是vector<int>::iterator
auto it2=cv.begin(); // it2的类型是vector<int>::const_iterator
如果对象只需要读操作而无须写操作的话最好使用常量类型,为了便于得到const_iterator类型的返回值,C++11新标准引入了两个函数,分别是cbegin和cend。
auto it3=v.cbegin(); //it3的类型是vector<int>::const_iterator
结合解引用和成员访问操作
解引用迭代器可获得迭代器所指的对象,如果该对象的类型恰好是类,就有希望进一步访问它的成员。
对于一个由字符串组成的vector对象来说,要想检查其元素是否为空,令it是该vector对象的迭代器,只需要检查it所指的字符串是否为空就可以了:
(*it).empty()
此处的()不能省略。为了简化上面的表达式,C++语言定义了箭头运算符->,箭头运算符把解引用和成员访问两个操作结合在一起,上面的表达式可以改写为:
it->mem
某些对vector对象的操作会使迭代器失效
虽然vector对象可以动态地增长,但是也会有一些副作用:
不能在范围for循环中向vector对象添加元素;
任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
迭代器运算
iter+n |
迭代器加上一个整数值扔得一个迭代器,迭代器所示的新位置与原来相比向前移动了若干个运算,结果迭代器或者指示容器内的一个元素,或者指向容器尾元素的下一个位置。 |
iter-n |
迭代器减去一个整数值扔得一个迭代器,迭代器所示的新位置与原来相比向后移动了若干个运算,结果迭代器或者指示容器内的一个元素,或者指向容器尾元素的下一个位置。 |
iter+=n |
迭代器加法的复合赋值语句 |
iter-=n |
迭代器减法的复合赋值语句 |
iter1-iter2 |
两个迭代器相减的结果是它们之间的距离,也就是说,将运算符右侧的迭代器向前移动差值个元素后将得到左侧的迭代器。参与运算的两个迭代器必须指向的是同一个迭代器中的元素或者尾元素的下一位置 |
> >= <= < |
迭代器的关系运算符,如果某迭代器指向的容器位置在另一个迭代器的位置之前,则说前者小于后者。参与运算的两个迭代器必须指向的是同一个容器中的元素或者尾元素的下一位置。 |