const_iterator 与 std::list 的迭代器

const_iterator vs iterator for std::list

除了 operator*operator-> 之外,std::list 的 const_iteratoriterator 实现之间是否存在任何重大差异。下面你可以看到我的非模板作业风格的例子来展示要点。据我了解,其余方法只是为这些 类 相互复制,例如 CTOR、operator==operator!=operator++operator++(int) , operator--, operator--(int).

class iterator
{
private:
    Node* m_node;

public:
    iterator(Node* node)
        : m_node(node)
    {

    }

    int& operator*()
    {
        return m_node->value;
    }

    Node* operator->()
    {
        return m_node;
    }

 ....
}

现在const迭代器实现

class const_iterator
{
private:
    Node* m_node;

public:
    const_iterator(Node* node)
        : m_node(node)
    {

    }

    int operator*() const
    {
        return m_node->value;
    }

    const Node* operator->() const
    {
        return m_node;
    }
......
}

如果这是主要区别,那么我们也应该处理重复,对吗?

您缺少下面描述的一些内容,class 还不是 "templetized",但方法与标准模板库的 one implementation 使用的方法相同.

  • 两个迭代器都需要一个默认构造函数 - 这提供了一种创建空迭代器的方法,您可以稍后对其进行分配
  • const_iterator 必须可以从 iterator 构造 - 添加构造函数到 const_iterator 以接受 "regular" 迭代器。

就代码重复而言,这确实是一个公平的观察。但是,大多数实现都适合一行,并且 return 不同的类型,因此尝试在两个模板之间共享实现会使代码更难阅读。