迭代器简介
2012-08-13 16:37 残月星辰 阅读(229) 评论(0) 编辑 收藏 举报迭代器是一种检查容器内元素并遍历元素的数据类型
标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器,而只有少数容器支持下标操作。因为迭代器对所有的容器都适用,现代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语句测试条件失败。