【问题标题】:How are iterators and pointers related?迭代器和指针有什么关系?
【发布时间】:2011-02-13 06:22:57
【问题描述】:

带有迭代器的代码看起来很像带有指针的代码。迭代器是一些晦涩的类型(例如std::vector<int>::iterator)。

我不明白迭代器和指针是如何相互关联的 - 迭代器是指针的包装器,具有重载操作以前进到相邻元素还是其他什么?

【问题讨论】:

    标签: c++ stl pointers iterator


    【解决方案1】:

    迭代器只是一种提供迭代器所需接口的类型——不同类型的迭代器是不同的,在 C++ 标准的第 24.1 节(迭代器要求)中指定。

    迭代器的实现方式取决于它们迭代的对象——对于向量,它们通常是指向数组的单个指针的包装器(无论如何在发布版本中),对于更复杂的容器,它们具有更复杂的实现。对于开放式范围,它们将包含用于生成元素的任何算法的状态。

    请注意,指向数组中元素的指针满足随机访问迭代器的要求,因此在某种程度上它们是可以互换的。

    【讨论】:

    • 我认为这里的词是concept而不是type
    【解决方案2】:

    迭代器是指针的泛化。

    迭代器(取决于变体)必须实现 * 和 ++

    所以指针是一个迭代器。但不一定反过来。

    如果你想迭代一个复杂的结构(一棵树、一个图......),迭代器将不仅仅是一个指针,并且不会对 ram 中的某个实际位置进行任何引用。

    【讨论】:

    • 这个答案没有矛盾吗?如果迭代器不仅仅是一个指针,那么指针肯定不能是迭代器吗?
    • 您能否详细说明“...并且没有提及内存中的某个实际位置”是什么意思?提前非常感谢您!
    • 例如,图节点上的迭代器可以是深度优先或广度优先。所以迭代器需要知道它在图中的位置来检索节点。所以迭代器是一个结构,具有属性和一切。它不仅仅是一个内存地址
    • RAM 恕我直言,是指物理内存。一个指针可能指向已交换到磁盘的内存。
    【解决方案3】:

    迭代器是重载某些运算符的对象,因此其用法看起来就像是指针。这在给定迭代器类别的能力范围内。随机访问迭代器看起来完全像指针,其他类型的迭代器不提供某些操作(例如,双向的 list<X>::iterator 没有运算符 += 以及许多其他需要随机访问的操作)。

    至于“晦涩的名称”,使用普通指针作为迭代器并非完全不可想象:

     template <class T>
     class MyContainer
     {
         ...
         typedef T* iterator;
     }
    
     MyContainer<int>::iterator it; //the type is really int*
    

    【讨论】:

      【解决方案4】:

      从概念上讲,是的——但它们不必是指针。它们的内部结构和功能将取决于它们“包装”的数据结构。

      这就是为什么会有不同的"classes" of iterators。例如。单向、双向、随机存取等

      有些可以做多个类。

      例如如果内部结构是红黑树或链表,则迭代器可能是双向的,但不是 RandomAccess。如果他们包装一个向量(实现为一个数组),您将拥有 RandomAccess 和 Bidirectional。

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 2015-09-16
        • 2015-09-06
        • 2019-11-22
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        相关资源
        最近更新 更多