迭代器简介

迭代器是一种检查容器内元素并遍历元素的数据类型

标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器,而只有少数容器支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作vector类型也是一样的。

容器的iterator类型

每种容器类型都定义了自己的迭代器类型,如vector:

vector<int>::iterator iter;

这语句定义了名为iter的变量,它的数据类型是vector<int>定义的iterator类型。

迭代器和迭代器类型

程序员首次遇到有关迭代器的术语时可能会困惑不解,原因之一是由于同一个术语 iterator 往往表示两个不同的事物。一般意义上指的是迭代器的概念;而具体而言时指的则是由容器定义的具体的iterator类型,如vector<int>.

重要理解的是,有许多用作迭代器类型,这些类型在概念上是相关的。若一种类型支持一组确定的操作(这些操作可用来遍历容器内的元素,并访问这些元素值),我们就这称种类型为迭代器。

各容器都定义了自己的iterator类型,用于访问容器的元素。换句话说,每一个容器都定义了一个名 iterator的类型,而这种类型支持(概念上)迭代器的各种操作。

begin 和 end 操作

每种容器都定义了一对命名为 begin 和end的函数,用于返回迭代器。如果容器中元素的话,由begin返回的迭代器指向第一个元素:

vector<string>::iterator iter =text.begin();// vector<string> text; 但是 text不能为空

上述语句把iter初始化为由名为vector操作返回值。假设vector不空,初始化后,iter即指该元素为text[0].

由end操作返回的迭代器指向vector的“ 末端元素的下一个”,表明他1指向了一个不存在的元素。

如果vector为空,begin返回的迭代器与end返回的迭代器相同。

由end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素。

vector迭代器的自增和解引用运算

迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素:

*iter=0;

解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象text的第一个元素,那么*iter和text[0]就指向同一个元素。

迭代器的其他操作

另一对可执行于迭代器的操作就是比较:用==或!=操作符比较两个迭代器,如果两个迭代器对象指向同一个元素,则他们相等,否则就不相等。

迭代器应用实例

假设已声明了一个vector<int>型的ivec变量,要把它所有元素值重置为0;

列出主要代码:

1     for(vector<int>::size_type ix =0; ix != ivec.size();++ix)
2     {
3         ivec[ix] =0;
4     }

上述程序用for循环遍历ivec的元素,for循环定义了一个索引ix,每循环迭代一次就自增1.for循环体将ivec的每个元素赋值为0.

更典型是用迭代器来编写循环:

1    for(vector<int>::iterator iter = ivec.begin();
2               iter != ivec.end();++iter)
3   {
4            *iter =0;
5   }

for循环首先定义了iter,并将它初始化为指向ivec的第一个元素。每次迭代iter都自增1,这个for循环的效果是从ivec第一个元素开始,顺序处理vector中的每一个元素。最后iter将指向ivec中的最后一个元素,处理完最后一个元素后iter再增加1,就会与end操作的返回值相等没在这种情况下,循环终止。

如果ivec为空,则begin返回的迭代器不指向任何元素(由于没有元素),所以它不能指向任何元素。从begin操作返回的迭代器与从end操作返回的迭代器值相同,则for语句测试条件失败。

原文地址:https://www.cnblogs.com/canyuexingchen/p/2636632.html