我正在尝试创建一个square_list
,我正是通过创建vector<list<T>>
来创建的。方形列表中的每列都是向量中的单独列表。当我创建list<T>::iterator
时,有没有办法让++
运算符超载?我需要重载它,以便我可以从一列列表的末尾跳转到下一列列表的开头。在这一点上,重新设计整个事物来创建方形列表并不是一个非常可行的选择。谢谢!
答案 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类模板的成员类型。
详细说明:
std::list<T>::iterator
。我们应该创建一个自定义迭代器。注意开放式原则。