所以我编写了这个程序并且它有效,但我被告知我需要使用迭代器来移动我编写的函数。我目前正在使用指针,但我认为它们基本上是相同的东西。如果存在差异,迭代器是如何使用的?
更新: 所以我理解的是,与指针不同,迭代器将移动到列表中的下一个项目,即使该项目在内存中不是下一个顺序?它是否正确?但那它怎么知道在哪里移动?我编写了一个添加和删除节点的二叉树。在每个节点中都有指向两个子节点的指针(或者只指向一个子节点),也指向指向父节点的指针。在函数中,我递归调用我正在使用的函数并传递新指针。我有一种感觉,用迭代器替换我所拥有的东西应该很容易,但我仍然不确定。
更新2: 我一直在做更多阅读并尝试一些例子,现在我对如何声明迭代器感到困惑。我遇到的所有事情都像我需要为迭代器创建另一个类。但是,当我尝试所有我得到的是编译器错误列表。任何帮助,将不胜感激。感谢
答案 0 :(得分:5)
存在差异,请考虑:
int arr[] = { 5, 6, 7, 8, 9, 10 };
int * ptr = arr;
printf("%d\n", *ptr++);
printf("%d\n", *ptr++);
你可能会看一下并说,"为什么要使用迭代器,有什么区别?"。在这个例子中,我们知道我们可以只指向基地址,并通过递增指针(将指向sizeof(int)字节)逐步执行。使用迭代器似乎很愚蠢,因为它只是绕着指针行走。
关键是,它只是在这种情况下用指针包裹 。
如果基础数据没有被传染性分配怎么办 - 你不能再仅仅增加一个指针了。如果它是一棵树怎么办?如果它是一个链表怎么办?
迭代器概念的重点在于,您可以抽象出如何来处理集合的问题,并且只依赖于标准的暴露迭代器方法。对于您收藏的用户,他们不必深入了解您的收藏如何存储元素。
答案 1 :(得分:1)
迭代器是不透明的对象,允许以统一的方式浏览特定的对象集合(总是以相同的方式),即使集合可能具有非常不同的内部结构。例如: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迭代器通常会被编译为指向优化开启的字符的指针)。
答案 2 :(得分:0)
即使选择迭代器或指针,结果也是一样。
但迭代器是抽象方法和设计模式。 它适用了很多语言,因为它是如何设计的。 它很有用,因为它为很多人所熟知。很多人都可以轻松理解。