【问题标题】:Implement Random Access Iterators on a linked list在链表上实现随机访问迭代器
【发布时间】:2018-07-07 04:18:12
【问题描述】:

所以我有一个自定义链表。每个节点都是一个结构体,它有一个指向下一个节点的 next 指针,并且 last->next 为空。

struct nodo {
    T value; 
    nodo *next;     

    nodo() : next(0) {}

    nodo(const T &v, nodo *n=0): value(v), next(n){}
};

我想在我的类中实现迭代器,因为我的类支持使用 operator[] 进行随机访问,所以我选择实现随机访问迭代器。 现在,我的问题在于以下运算符:

difference_type operator-(const iterator &other) {

}

它返回这个迭代器和其他迭代器之间的元素数量,但我不确定什么是最好的实现它。

【问题讨论】:

  • 我认为这暗示您的迭代器并不是真正的随机访问
  • 你为什么这么说?
  • 随机访问的要点是位置类型iterator,可以从任何位置使用到任何其他位置。如果真是这样,计算差异应该不会太难。您可以轻松实现前向迭代器。为什么还不够好?
  • "随机访问的要点是位置类型,即迭代器,可以从任何位置使用到任何其他位置。"这正是我正在寻找的
  • 你搞错了。您没有使用 operator[] 的随机访问权限,因此将实现随机访问迭代器 - 您需要实现随机访问迭代器,然后所有其余部分自然而然地消失。就像@StoryTeller 所说的那样,您展示的数据结构不可能实现随机访问迭代器。您声称已经实现了 operator[],如何实现?它是随机访问迭代器所要求的恒定时间吗?

标签: c++ linked-list iterator


【解决方案1】:

链表不是随机访问容器。您不能有意义地实现随机访问迭代,也不能为常规的单链表或双链表实现传统的operator[](size_t)

使用您的列表类的人不会期望随机访问迭代,并且会被它弄糊涂。使用您的“随机访问”迭代器并发现它们不符合标准和约定的人也会感到困惑。

A RandomAccessIterator is a BidirectionalIterator that can be moved to point to any element in constant time.

只有当你的容器可以在恒定时间内按索引访问元素时,你才应该公开随机访问接口。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2021-01-12
    • 2017-09-02
    • 2022-11-14
    • 1970-01-01
    • 2019-12-06
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多