如果我创建一个list <t> :: iterator,有没有办法重载++(increment)运算符?</t>

时间:2014-08-13 23:48:02

标签: c++ list iterator std

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

1 个答案:

答案 0 :(得分: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来创建一个自定义迭代器,并通过创建自己的操作符来隐藏原始操作符。

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


详细说明:

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