迭代器和指针的区别是什么?

4
我写了一个程序,它能正常运行,但是我被告知需要在我编写的函数中使用迭代器来移动。我目前正在使用指针,但我认为它们基本上是相同的东西。如果有区别,那么迭代器是如何使用的呢?
更新: 所以,我的理解是,与指针不同,迭代器将移动到列表中的下一项,即使该项在内存中不是顺序下一个?这个理解正确吗?但是,它是如何知道要移动到哪里的呢?我已经编写了一个添加和删除节点的二叉树。每个节点都有指向两个子节点(或一个或没有)和指向父节点的指针。在函数中递归调用我使用的函数,并传递新指针。我觉得用迭代器替换我的代码应该很容易,但我仍然不确定。
更新2: 我已经阅读了更多内容并尝试了一些示例,但我现在甚至不知道如何声明一个迭代器。我遇到的所有内容都像是我需要为迭代器创建另一个类一样。但是,当我尝试时,我只会得到一堆编译器错误。希望得到帮助。谢谢。

4
指针就像迭代器一样,苹果是水果的代表。不过有时候你可能想要一杯梨子苹果酒。 - Kerrek SB
1
简单区别:C语言没有迭代器。 - too honest for this site
那么我该如何使用迭代器来替换我的指针呢? - couchprogramer
如果你的程序已经能够正常工作,为什么还需要使用迭代器呢? - Thomas Matthews
1
迭代器是指具有类似指针语义的指针概念的抽象。指针可以在连续的内存块上进行迭代,而迭代器可以被制作成在复杂、任意排列的数据结构上进行迭代。 - Galik
3个回答

9

有所不同,请考虑以下内容:

int arr[] = { 5, 6, 7, 8, 9, 10 };
int * ptr = arr;

printf("%d\n", *ptr++);
printf("%d\n", *ptr++);

你可能会问:“为什么要使用迭代器,有什么不同?”在这个例子中,我们知道我们可以直接指向基地址,并通过增加指针(它将步进sizeof(int)字节)来遍历。使用迭代器似乎很愚蠢,因为它只是包装了一个指针。
关键在于,在这种情况下,它只是包装了一个指针。
如果底层数据不是连续分配的,那该怎么办 - 你不能再简单地增加一个指针了。如果它是一棵树呢?如果它是一个链表呢?
迭代器概念的重点在于,你可以抽象出如何遍历集合的关注点,只需依赖于标准公开的迭代器方法。对于你的集合的用户,他们不必了解你的集合如何存储元素。

那么在这个例子中,迭代器应该如何使用?很抱歉,但我一直使用指针,但从我的理解来看,迭代器就像是告诉指针如何移动,而不是手动移动指针? - couchprogramer
你已经标记了c++/c,但我猜你只是在做c++。你需要做的是创建一个继承自std::iterator的类,该类将定义描述如何遍历集合的方法。请参见此链接以获取更多示例:http://codereview.stackexchange.com/questions/74609/custom-iterator-for-a-linked-list-class。请注意,他们嵌入了一个迭代器类,该类扩展了std::iterator类,并具有遍历其特定容器的知识。 - Walter Delevich

3

迭代器是一种不透明的对象,允许以统一的方式(始终相同的方式)浏览通过某个集合的对象。即使集合可能具有非常不同的内部结构。例如:std::map通常实现为红黑树,std::vector是占用一块内存的数组。在向量中遍历所有元素与在树中遍历所有元素非常不同。但是,迭代器为您抽象了这个过程-您总是使用++和--运算符和迭代器以相同的方式进行操作:

auto iter = <whatever-container>.begin();
auto end  = <whatever-container>.end();
//go through all elements of the container:
while(iter != end)
{
    //do something
    ++iter;
}

某些C++编译器优化可以归结为使用指针(例如,启用优化后,std::string迭代器通常会被编译成指向字符的指针)。

0

无论您选择迭代器还是指针,结果都是相同的。

但是迭代器是一种抽象方法和设计模式。 它已经被许多语言所采用,因为这是如何设计的。 它很有用,因为它被许多人熟知。因此,许多人可以轻松理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接