【问题标题】:const_iterator vs iterator for std::liststd::list 的 const_iterator 与迭代器
【发布时间】:2016-07-22 15:36:53
【问题描述】:

除了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;
    }
......
}

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

【问题讨论】:

  • 你的迭代器可以转换成 const_iterator 吗?
  • @RichardCritten 是的,我认为应该是,但我没有写过。 iterator 应该有operator const_iterator
  • 我在某些实现中看到iterator 派生自const_iterator
  • 是的,比如微软的 impl! :)

标签: c++ c++11 stl iterator stdlist


【解决方案1】:

您缺少以下描述的一些内容,并且该类尚未“模板化”,但方法与标准模板库的one implementation 使用的方法相同。

  • 两个迭代器都需要一个默认构造函数 - 这提供了一种创建空迭代器的方法,您可以稍后分配它
  • const_iterator 必须可以从 iterator 构造 - 将构造函数添加到 const_iterator 以接受“常规”迭代器。

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

【讨论】:

  • iteratorconst_iterator 的实现如何放在一行中?
  • 我认为 - 隐含了“方法”实现。
  • @Yakk 我说的是成员函数和操作符的实现(参见源代码链接,向下滚动到“迭代器”实现)。
  • 谢谢,您的回答很有价值。
猜你喜欢
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2020-08-30
  • 2011-12-07
  • 1970-01-01
  • 2011-06-20
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多