So what does the custom iterator class look like?
I decided to give it a stab, and here's my incomplete attempt:
Code:
#include <iostream>
#include <list>
#include <iterator>
template<typename T>
class circular_list_iterator : public std::iterator<std::forward_iterator_tag, T>
{
public:
circular_list_iterator(std::list<T>& container)
: container(container), iter(container.begin()) {}
circular_list_iterator(std::list<T>& container, typename std::list<T>::iterator iter)
: container(container), iter(iter) {}
circular_list_iterator& operator++()
{
if (iter != container.end())
{
++iter;
}
else
{
iter = container.begin();
}
return *this;
}
T operator*()
{
return *iter;
}
bool operator!=(circular_list_iterator rhs) const
{
return iter != rhs.iter;
}
private:
std::list<T>& container;
typename std::list<T>::iterator iter;
};
template<typename T>
circular_list_iterator<T> circular_list_end(std::list<T>& container)
{
return circular_list_iterator<T>(container, container.end());
}
int main()
{
std::list<int> numbers;
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(5);
numbers.push_back(7);
numbers.push_back(11);
circular_list_iterator<int> i(numbers);
for (; i != circular_list_end(numbers); ++i)
{
std::cout << *i << ' ';
}
std::cout << '\n';
++i; // Loop back to the front.
for (circular_list_iterator<int> j(i); j != circular_list_end(numbers); ++j)
{
std::cout << *j << ' ';
}
std::cout << '\n';
}
I hope it is on the right track...