赞
踩
<iterator>是C++标准程序库中的一个头文件,定义了C++ STL标准中的一些迭代器模板类,这些类都是以std::iterator为基类派生出来的。迭代器提供对集合(容器)元素的操作能力。迭代器提供的基本操作就是访问和遍历。迭代器模拟了C++中的指针,可以有++运算,用*(解引用算符,deference)或->算符来访问容器中的元素。容器中元素如果改变了所用内存,也不影响绑定的迭代器指向正确的位置。因此,迭代器实际上更像是句柄(handler)。迭代器允许C++程序以统一的方式处理不同的数据结构。迭代器充当容器和通用算法之间的中介。而不是对特定数据类型进行操作,算法被定义为在一个迭代器类型指定的范围内运行。任何满足迭代器要求的数据结构都可以通过算法进行操作。
STL的迭代器实现了设计模式中的”迭代器模式”,即顺序访问一个聚合中的元素,又不暴露聚合的实现细节。
迭代器支持以不同方法遍历聚合类型。例如,对一颗树数据类型,可以有前序、中序、后序遍历的迭代器。同一个聚合类型的对象上,可以同时有多个迭代器,各自保持不同的遍历状态。在不同的聚合类型上实现的迭代器具有标准的对外接口,这给STL中的算法使用迭代器提供了可能。
一共支持五种迭代器:
输入迭代器(*iter解引用后只能用作右值)、
输出迭代器(*iter解引用后只能用作左值)、
前向迭代器(具有输入迭代器、输出迭代器的所有功能,且可以反复遍历操作,支持对同一个元素的多次读写)、
双向迭代器(是在前向迭代器的基础上,多了单步向后遍历的能力)、随机访问迭代器(在双向迭代器基础上,具有直接访问各数据元素的能力。
随机迭代器增加了”迭代器算术运算”)。
std::input_iterator_tag:空类,标识一个迭代器的类别为输入迭代器。属性如下:
每种容器类型都定义了自己的迭代器类型
标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更一般化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素。
容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector: vector<int>::iterator iter;
这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
每个标准库容器类型都定义了一个名为iterator的成员,这里的iterator与迭代器实际类型的含义相同。
不同的容器类定义了自己的iterator类型,用于访问容器内的元素。换句话说,每个容器定义了一种名为iterator的类型,而这种类型支持(概念上的)迭代器的各种行为。每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。
如果容器中有元素的话,由begin返回的迭代器指向第一个元素:vector<int>::iterator iter = ivec.begin();
上述语句把iter初始化为由名为begin的vector操作返回的值。假设vector不空,初始化后,iter即指该元素为ivec[0]。- // reset all the elements in ivec to 0
-
- for (vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
-
- ivec[ix] = 0;
上述程序用for循环遍历ivec的元素,for循环定义了一个索引ix,每循环迭代一次ix就自增1。for循环体将ivec的每个元素赋值为0。
- // equivalent loop using iterators to reset all the elements in ivec to 0
-
- for (vector<int>::iterator iter = ivec.begin();iter != ivec.end(); ++iter)
-
- *iter = 0; // set element to which iter refers to 0
for循环首先定义了iter,并将它初始化为指向ivec的第一个元素。for循环的条件测试iter是否与end操作返回的迭代器不等。每次迭代iter都自增1,这个for循环的效果是从ivec第一个元素开始,顺序处理vector中的每一元素。最后,iter将指向ivec中的最后一个元素,处理完最后一个元素后,iter再增加1,就会与end操作的返回值相等,在这种情况下,循环终止。
- // use const_iterator because we won't change the elements
-
- for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++iter)
-
- cout << *iter << endl; // print each element in text
- for (vector<string>::const_iterator iter = text.begin();iter != text.end(); ++ iter)
-
- *iter = " "; // error: *iter is const
- vector<int> nums(10); // nums is nonconst
-
- const vector<int>::iterator cit = nums.begin();
-
- *cit = 1; // ok: cit can change its underlying element
-
- ++cit; // error: can't change the value of cit
-
- const vector<int> nines(10, 9); // cannot change elements in nines
-
- // error: cit2 could change the element it refers to and nines is const
-
- const vector<int>::iterator cit2 = nines.begin();
-
- // ok: it can't change an element value, so it can be used with a const vector<int>
-
- vector<int>::const_iterator it = nines.begin();
-
- *it = 10; // error: *it is const
-
- ++it; // ok: it isn't const so we can change its value
-
- // an iterator that cannot write elements
-
- vector<int>::const_iterator
-
- // an iterator whose value cannot change
-
- const vector<int>::iterator
迭代器的算术操作
- iter + n
- iter - n
可以对迭代器对象加上或减去一个整型值。这样做将产生一个新的迭代器,其位置在iter所指元素之前(加)或之后(减)n个元素的位置。加或减之后的结果必须指向iter所指vector中的某个元素,或者是vector末端的后一个元素。加上或减去的值的类型应该是vector的size_type或difference_type类型(参考下面的解释)。
http://www.cnblogs.com/quant-lee/p/6618829.html
https://blog.csdn.net/fengbingchun/article/details/77985191
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。