【问题标题】:How to implement list<T>::iterator?如何实现 list<T>::iterator?
【发布时间】:2017-07-30 02:06:05
【问题描述】:

我知道如何实现模板类。
但是,我不明白以下list&lt;int&gt;::iterator 是如何在内部实现的。我应该创建一个命名空间吗?
(基本上我想在自定义实现中使用相同的 STL 语法。)

list<int> l;
list<int>::iterator it = l.begin();

简而言之,在没有任何 STL 库的情况下让代码工作的最简单方法是什么?

这是自定义列表实现的 sn-p: (为了可读性,我省略了大部分方法。)

template <typename T>
struct list {
        struct listNode {
        listNode() : item(0), next(0) {}
                listNode(T x) : item(x), next(0) {}
                T item;
                listNode* next;
        };
        list() : head(0),tail(0) {}     
        listNode* head;
        listNode* tail;
};

【问题讨论】:

  • 为什么不看看你的 STL 实现,看看list::iterator 是如何实现的?
  • StackOverflow 不是一个让其他人编写代码的网站。您需要尝试编写它,如果遇到问题,请发布您拥有的代码并明确说明您遇到的具体问题。
  • 我想我没有清楚地说明我的问题。我只是不明白符号本身的机制。我也不希望人们实现我的代码。迭代器怎么可能有一个未知的容器?
  • 是什么让你认为你需要一个“未知容器”?
  • 例如,list::iterator 和 set::iterator。我想知道 :: 符号在内部是如何工作的。

标签: c++ templates linked-list iterator


【解决方案1】:

您可以在容器类型中实现迭代器类型,以便它具有有关它正在迭代的容器的任何信息。

template<class T>
class SomeContainer {

public:

    class Iterator {
        // You can use SomeContainer and T in here.  
    };
};

【讨论】:

  • 请注意,至少一些现代 STL 实现不会这样做:如果您愿意,请使用谷歌 SCARY 迭代器。然而,这种技术是可行的,并且是你应该如何开始这样做以便学习。
  • 这是我一直在寻找的答案。我不知道可以使用 :: 运算符访问嵌套类。谢谢。
  • @PeterHwang 添加了“public:”
猜你喜欢
  • 2012-06-16
  • 2011-10-09
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
相关资源
最近更新 更多