【问题标题】:What is difference between iterators and pointers [duplicate]迭代器和指针有什么区别[重复]
【发布时间】:2015-09-16 15:31:28
【问题描述】:

所以我编写了这个程序并且它可以工作,但是我被告知我需要使用迭代器来移动我编写的函数。我目前正在使用指针,但我认为它们基本上是相同的东西。如果有区别,如何使用迭代器?

更新: 所以我的理解是,与指针不同,迭代器将移动到列表中的下一个项目,即使该项目不是内存中的下一个项目?它是否正确?但是,它怎么知道移动到哪里呢?我编写了一个添加和删除节点的二叉树。在每个节点中都有指向两个子节点(或只有一个或没有)的指针,还有一个指向父节点的指针。在函数中,我递归地调用我正在使用的函数并传递新的指针。我觉得用迭代器替换我所拥有的应该很容易,但我仍然不确定。

更新 2: 我一直在阅读并尝试一些示例,现在我对如何声明迭代器感到困惑。我遇到的所有事情都像是我需要为迭代器创建另一个类。但是当我尝试时,我得到的只是编译器错误列表。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 指针指向迭代器就像苹果指向水果一样。不过,有时你想要一杯梨苹果酒。
  • 简单的区别:C没有迭代器。
  • 那么我将如何使用迭代器来替换我拥有的指针?
  • 如果您的程序已经可以运行,为什么还需要使用迭代器?
  • iteratorpointer 概念的抽象,具有 pointer-like 语义。 指针可以迭代连续的内存块,而迭代器可以用来迭代复杂的、任意排列的数据结构。

标签: c++ iterator


【解决方案1】:

有区别,请考虑:

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

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

你可能会说,“为什么要使用迭代器,有什么区别?”。在这个例子中,我们知道我们可以只指向基地址,并通过递增指针来逐步执行(这将步进 sizeof(int) 个字节)。使用迭代器似乎很愚蠢,因为它只是包装了一个指针。

关键是,它只是包装了一个指针在这种情况下

如果底层数据没有连续分配怎么办——你不能再增加一个指针。如果是树呢?如果是链表呢?

迭代器概念的要点在于,您可以抽象如何 遍历集合的关注点,并且只依赖于标准公开的迭代器方法。对于您的收藏的用户,他们不必深入了解您的收藏如何存储元素。

【讨论】:

  • 那么在这个例子中如何使用迭代器我很抱歉,但我一直使用指针,但我得到的是迭代器就像告诉指针如何移动而不是手动移动指针?
  • 你已经标记了这个 c++/c 但我猜你只是在做 c++。您要做的是创建一个从 std::iterator 继承的类,然后该类将定义描述 如何 遍历您的集合的方法。有关更多示例,请参阅此链接:codereview.stackexchange.com/questions/74609/…。请注意他们如何嵌入一个迭代器类,该迭代器类扩展了 std::iterator 类,并且知道如何遍历他的特定容器。
【解决方案2】:

迭代器是不透明的对象,允许以统一的方式(始终以相同的方式)浏览特定的对象集合,即使这些集合可能具有非常不同的内部结构。例如:一个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 迭代器通常会被编译为仅指向启用优化的字符的指针)。

【讨论】:

    【解决方案3】:

    即使选择迭代器或指针,结果都是一样的。

    但迭代器是抽象方法和设计模式。 它适应了很多语言,因为它是如何设计的。 它很有用,因为它为许多人所熟知。很多人都可以轻松理解。

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 2012-06-14
      • 2011-07-17
      • 2016-10-11
      • 1970-01-01
      • 2011-02-13
      • 2017-09-21
      • 2018-01-28
      • 2011-04-04
      相关资源
      最近更新 更多