【问题标题】:If I create a list<T>::iterator, is there a way to overload the ++(increment) operator? [duplicate]如果我创建一个 list<T>::iterator,有没有办法重载 ++(increment) 运算符? [复制]
【发布时间】:2014-08-13 23:48:01
【问题描述】:

我正在尝试创建square_list,我正在通过创建vector&lt;list&lt;T&gt;&gt; 来实现。方形列表中的每一列都是向量中的一个单独列表。当我创建list&lt;T&gt;::iterator 时,有没有办法重载++ 运算符?我需要重载它,以便我可以从一个列列表的末尾跳到下一列列表的开头。在这一点上,重新设计整个东西以创建方形列表并不是一个非常可行的选择。谢谢!

【问题讨论】:

  • @Cyber​​:虽然技术上是正确的,但这是一个 XY 问题,你走错了路。他需要创建一个自定义迭代器,而不是更改现有的std::list::iterator 来跳转列。
  • 你认为你可以给我一个关于如何做到这一点的快速教程吗?我唯一需要改变的是 ++ 实现。将不胜感激!
  • 所以你有一个vector 的lists,并且你想遍历所有列表中的所有元素?
  • 是的,就是这样。

标签: c++ list iterator std


【解决方案1】:

为了演示这个想法,这里是一个不完整的设计和测试程序:

class square_list_iterator
    :
    public list<int>::iterator
{
    vector<list<int>>::iterator outer_it;

public:
    square_list_iterator(vector<list<int>>& sl)
    :
        list<int>::iterator{sl.begin()->begin()},
        outer_it{sl.begin()}
    {}
    square_list_iterator& operator++()
    {
        list<int>::iterator::operator++();
        if (*this == outer_it->end())
        {
            ++outer_it;
            list<int>::iterator::operator=((*outer_it).begin());
        }
        return *this;
    }
};

int main()
{
    vector<list<int>> sl{{1,2,3},{4,5,6}};
    square_list_iterator it{sl};

    cout << *it << endl;
    ++it;
    cout << *it << endl;
    ++it;
    cout << *it << endl;
    ++it;
    cout << *it << endl;
    ++it;
    cout << *it << endl;
    ++it;
    cout << *it << endl;
    ++it;
    return 0;
}

再一次,它是不完整的。这只是一个想法。

想法是通过继承list::iterator创建自定义迭代器,并通过创建自己的隐藏原来的operator++。

您可能还需要实现其他运算符和构造函数以及成员函数来完成它。一对非成员 begin() 和 end() 可能会有所帮助。这个迭代器可以是你的 square_list 类模板的成员类型。


详细说明:

  1. 我没有按照你的要求做。我没有重载增量运算符。我正在隐藏它并创建一个新的来替换它。
  2. 我同意 Mooing Duck 的评论。我们不应该改变std::list&lt;T&gt;::iterator。我们应该创建一个自定义迭代器。请注意开闭原则。
  3. 您说您不想从头开始创建迭代器。所以,我建议继承。但请注意缺点和替代方案。
  4. 重载在基类和派生类之间不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 2012-12-09
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多