社区
C++ 语言
帖子详情
关于Iterator
banana302
2005-03-19 10:13:28
Iterator一般是什么用法,为啥有的类要定义自己的Iterator.能不能举个例子说明一下
...全文
566
9
打赏
收藏
关于Iterator
Iterator一般是什么用法,为啥有的类要定义自己的Iterator.能不能举个例子说明一下
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BillSmith
2005-03-22
打赏
举报
回复
上面诸位的看法仅限于C++的STL及其扩展。未免稍有狭隘知处。
然而Iterator不仅是遍历线性容器,只要是做遍历就可以称作Iterator,++,--的意思是上一个和下一个,至于谁是上一个和下一个,完全看用户的定义。
比如我可以写这样的iterator.
class tree
{
class QXiterator //不好意思忘了前序英文是什么,姑且拼音之。
{
public:
operator++ //意思一下,不严格写了。
operator-- //这里的++,--就是按照前序顺序的下一个和上一个。
};
//还可以写后序遍历的iterator,只需要改动++,--的定义,也就是上一个和下一个的定义。
//另外可以写自己的iterator,不是前序后序中序,只要能够明确说出上一个和下一个就可以。
};
至于iterator是不是一定要支持指针的所有运算,我以为没必要,iterator不是指针的抽象,而是遍历顺序的抽象,诚然往往需要通过iterator访问其指向的东西,因此需要提供相应运算,但是没有必要做到支持指针的所有运算。
另外纵然是线性容器也可以写不是按照一个挨一个的方式访问的iterator。
如果是非线性容器,或者是用户定制的不标准的iterator,或者没有需求,那么iterator的减法以及比较大小运算也可以不要。
tokens
2005-03-22
打赏
举报
回复
呵..我一般就是把它当成VECTOR中封装的一个指针.
tip9914
2005-03-19
打赏
举报
回复
看看JJ侯得STL源码就知道了
iterator是迭代器,通俗一点说就是具有类似指针功能得一种类型,可以有++,——运算,*,——》算符
但是功能又比原生指针更多,一般只有STL中会用到ITERATOR,用来迭代容器中得元素
BillSmith
2005-03-19
打赏
举报
回复
iterator就是迭代器,我愿意叫她遍历器,用来遍历容器元素的。
不同的iterator可以有不同的遍历顺序,只要++和--操作符定义不一样就行了。
比如一棵树的iterator可以有前序的中序的和后序的,
你就可以写不同的iterator,分别实现之。
结果就是你创建一个前序iterator对象,你在作++运算后该对象就会指向按前序遍历的顺序排的下一个节点。
tudou614
2005-03-19
打赏
举报
回复
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;
}
你可以改一下,看下效果,体会下如何用
tudou614
2005-03-19
打赏
举报
回复
不用循环也能打印
#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;
}
tip9914
2005-03-19
打赏
举报
回复
举例:比如vector得例子
int a[N];
for(int i=0;i<N;i++)
a[i]=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
jwwu
2005-03-19
打赏
举报
回复
iterator就是容器的元素的指针
只不过把他模板化据用通用性
speedfirst
2005-03-19
打赏
举报
回复
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之间的加法运算,类似于指针加法
剑指offer 5、用两个栈实现队列 python和c++
题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 思路:先用一个栈1来存 “进队列” 的数据,另一个栈2把栈1数据元素反转来作为 “出队列” 的顺序,此时把栈1清空。在栈2的数据没出队列完的时候,栈1累计后面进队列的数据。到栈2的数据都出队列了,又把栈1数据元素反转放到栈2来作为 “出队列” 的顺序,此时又把栈1清空。 其实也挺好理解,栈2存的都是某次出队列前进队列的数据,在栈2没空之前,栈2里面的数据都是最先进队列的,肯定要先出。 c++版 class Solu
剑指offer 5.栈和队列 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解题思路:1,整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程就是一个队列的先进先出2,但是在交换元素的时候需要判断两个栈的元素情况:“进队列时”,队列中是还还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1中,保持在“进队列状态”。“出队...
剑指offer-5 用两个栈来实现一个队列,完成队列的push和pop操作
题目要求 两栈 实现队列功能 先入先出 解题思路: 栈的输出反向pop即为队列的输出 class Solution: def __init__(self): self.s1 = [] self.s2 = [] def push(self,node): self.s1.append(node) ...
剑指offer5-用两个栈来实现一个队列,完成队列的Push和Pop操作
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 class Solution { public: void push(int node) { stack1.push(node);//入栈直接压入stack1 } int pop() { //关键是出栈这里,需要捋清楚一点就是只要stack2不为...
java 栈和队列实现迷宫代码_Java版剑指offer编程题第5题--两个栈实现队列
跟learnjiawa一起每天一道算法编程题,既可以增强对常用API的熟悉能力,也能增强自己的编程能力和解决问题的能力。算法和数据结构,是基础中的基础,更是笔试的重中之重。不积硅步,无以至千里;不积小流,无以成江海。题目描述剑指offer编程题第5题--两个栈实现队列,用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。我的想法栈的特点是先进后出,队列的特点是先进先...
C++ 语言
65,213
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章