iterator就是迭代器,我愿意叫她遍历器,用来遍历容器元素的。
不同的iterator可以有不同的遍历顺序,只要++和--操作符定义不一样就行了。
比如一棵树的iterator可以有前序的中序的和后序的,
你就可以写不同的iterator,分别实现之。
结果就是你创建一个前序iterator对象,你在作++运算后该对象就会指向按前序遍历的顺序排的下一个节点。
--------------------------------------------------------------------------------
看看JJ侯得STL源码就知道了
iterator是迭代器,通俗一点说就是具有类似指针功能得一种类型,可以有++,——运算,*,——》算符
但是功能又比原生指针更多,一般只有STL中会用到ITERATOR,用来迭代容器中得元素
--------------------------------------------------------------------------------
iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。例如C++ STL就是使用iterator。MFC自己的容器使用position。C#和java也有自己的方法,但方法是不变的。
iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent = m_pCurrent->pNext;的操作。因此每种容器都有自己的iterator实现方法。
C++ STL iterator的常用方法有:
iterator++ 移到下个元素
iterator-- 移到上个元素
*iterator 访问iterator所指元素的值]
< > == != iterator之间的比较,例如判断哪个元素在前
iterator1 + iterator2 iterator之间的加法运算,类似于指针加法
--------------------------------------------------------------------------------
iterator就是容器的元素的指针
只不过把他模板化据用通用性
--------------------------------------------------------------------------------
举例:比如vector得例子
int a[N];
for(int i=0;i<N;i++)
a=i;
vector<int> vec(a,a+N);
vector<int >:: iterator ite=vec.begin
();
vector<int >:: iterator ite_end=vec.end();
while(ite!=ite_end)
{
cout<<*ite;
ite++;
}
cout<<endl;
//输出为0,1,2,3,4,5.......N
--------------------------------------------------------------------------------
不用循环也能打印
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> demo_string(2);
demo_string[0]="这是第1个string对象!";
demo_string[1]="这是第2个string对象!";
cout<<demo_string[0]<<endl;
cout<<demo_string[1]<<endl;
cin.get();
return 0;
}
--------------------------------------------------------------------------------
MSDN中给出的ITERATOR的例子有些简单的,比如:
/* Compile options needed:-GX
*/
#include <iostream>
#include <deque>
using namespace std;
#if _MSC_VER > 1020 // if VC++ version is > 4.2
using namespace std;
// std c++ libs implemented in std
#endif
typedef deque<int, allocator<int> > INTDEQUE;
void main()
{
// Create A and fill it with elements 1,2,3,4 and 5
// using push_back function
INTDEQUE A;
A.push_back(1);
A.push_back(2);
A.push_back(3);
A.push_back(4);
A.push_back(5);
// Print the contents of A using iterator
// and functions begin
() and end()
INTDEQUE::iterator pi;
for(pi= A.begin
();
pi !=A.end();
pi++)
{
cout << *pi <<" "
}
cout<<endl;
}
你可以改一下,看下效果,体会下如何用
--------------------------------------------------------------------------------
上面诸位的看法仅限于C++的STL及其扩展。未免稍有狭隘知处。
然而Iterator不仅是遍历线性容器,只要是做遍历就可以称作Iterator,++,--的意思是上一个和下一个,至于谁是上一个和下一个,完全看用户的定义。
比如我可以写这样的iterator.
class tree
{
class QXiterator //不好意思忘了前序英文是什么,姑且拼音之。
{
public:
operator++ //意思一下,不严格写了。
operator-- //这里的++,--就是按照前序顺序的下一个和上一个。
};
//还可以写后序遍历的iterator,只需要改动++,--的定义,也就是上一个和下一个的定义。
//另外可以写自己的iterator,不是前序后序中序,只要能够明确说出上一个和下一个就可以。
};
至于iterator是不是一定要支持指针的所有运算,我以为没必要,iterator不是指针的抽象,而是遍历顺序的抽象,诚然往往需要通过iterator访问其指向的东西,因此需要提供相应运算,但是没有必要做到支持指针的所有运算。
另外纵然是线性容器也可以写不是按照一个挨一个的方式访问的iterator。
如果是非线性容器,或者是用户定制的不标准的iterator,或者没有需求,那么iterator的减法以及比较大小运算也可以不要。
--------------------------------------------------------------------------------
呵..我一般就是把它当成VECTOR中封装的一个指针.