【问题标题】:Iterator in C++C++ 中的迭代器
【发布时间】:2015-01-30 11:55:16
【问题描述】:

我正在尝试创建自己的翻译器。是大学作业。我的类翻译器中需要一个迭代器。

class Translator
{
private:
    map <string,Word> translator;

public:
    class iterator
    {
       friend class Translator;
        private:
            map<string,Word>::iterator itm;

        public:
            iterator operator++();
            pair <string,Word> &operator*();
            bool operator==(const iterator &it)const;
    };
};

我正在尝试超载operator*()

这是代码。

pair <string, Word>& Translator::iterator::operator*()
{
  return (*itm);
}

错误:

invalid initialization of reference of type ‘std::pair&lt;std::basic_string&lt;char&gt;, Word&gt;&amp;’ from expression of type ‘std::pair&lt;const std::basic_string&lt;char&gt;, Word&gt;

【问题讨论】:

  • 顺便说一句,您可能想调用更少的东西translator。只是为了让谈论/推理你的代码更容易。 ;)

标签: c++ c++11 iterator overloading operator-keyword


【解决方案1】:

map的key是常量,所以value类型是pair&lt;const string, Word&gt;

某些类型别名可能会使代码更友好:

typedef map <string,Word> map_type;
typedef map_type::value_type value_type;

value_type &operator*();

【讨论】:

  • 这是一个很容易犯的错误,是不推荐明确提及类型的一个很好的例子。
【解决方案2】:

它比实际答案更像是一个补充,但如果你想要一个好的迭代器(STL 兼容),你还需要添加几个 typedef,例如你的迭代器的类型(在你的情况下你有一个输入迭代器)。然后,您可以将迭代器与任何非常好的 stl 算法一起使用。然而,这可能非常麻烦。

一个非常好的方法是使用boost facade iterators,您只需要重写所需的输入迭代器的三个方法,它们指定如何递增、测试两个迭代器是否相等和取消引用。然后 Boost 会为您完成所有繁琐的工作,然后您可以将所有 stl 算法与您的标准兼容迭代器一起使用。

这是我给你的链接中的一个例子:

# include <boost/iterator/iterator_facade.hpp>
# include "node.hpp"
class node_iterator  : public boost::iterator_facade<
    node_iterator
  , node_base
  , boost::forward_traversal_tag
>{
 public:
node_iterator()
  : m_node(0) {}

explicit node_iterator(node_base* p)
  : m_node(p) {}
 private:
friend class boost::iterator_core_access;

void increment() { m_node = m_node->next(); }

bool equal(node_iterator const& other) const
{
    return this->m_node == other.m_node;
}

node_base& dereference() const { return *m_node; }

node_base* m_node;
};

【讨论】:

  • 虽然您的建议通常很有用,但并不能回答问题
  • 你说得对,它更多的是补充信息。我编辑了我的“答案”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
相关资源
最近更新 更多