Bartek Banachewicz
Bartek Banachewicz

Reputation: 39390

How to check if simple C++ standard library iterator can be advanced?

Suppose I have a class encapsulating std container:

class Stash
{
    list<int> Data;

public:
    list<int>::const_iterator GetAccess() const { return Data.begin(); }
};

It's very convenient way of forcing the user to read the data in form of the iterator. However, I can't find the way other that comparing the iterator to container.end(). So, I would like to know if there's an option to do it solely by stdlib or I have to write iterator class myself (with can_advance method, for example).

Relevant question might be this one, but it asks whether the iterator is valid, not whether it can advance. I weren't able to find any information about the latter.

Upvotes: 4

Views: 418

Answers (3)

Mike DeSimone
Mike DeSimone

Reputation: 42825

What you seem to be asking for is a "lookahead" iterator. You could write a class to "adapt" an iterator to have lookahead, where the adaptor just stays one step ahead of your code:

template<class FwdIter>
class lookahead_iterator
{
public:
    lookahead_iterator(const FwdIter& begin): cur_iter(begin), next_iter(++begin) {}
    operator FwdIter() const { return cur_iter; }
    lookahead_iterator<FwdIter>& operator ++() { cur_iter = next_iter++; return *this; }
    // Other methods as needed.
private:
    FwdIter cur_iter;
    FwdIter next_iter;
};

Needless to say, this gets a lot more complicated if you need more than a forward iterator.

Upvotes: 0

Pete Becker
Pete Becker

Reputation: 76458

Iterators work in pairs: an iterator that points to the beginning of a sequence and an iterator that points past the end of the sequence. That's why all the containers have begin() and end() member functions: so you can look at the sequence of values that the container manages.

It would be far more idiomatic to change the name of GetAccess to begin and to add end. Having end() would also make it possible to apply standard algorithms to the data.

Upvotes: 2

Xeo
Xeo

Reputation: 131837

You can't do this, a single iterator does not contain the information when it is at the end of the sequence its pointing into.

Normally, this is solved by either providing a range (think std::make_pair(cont.begin(), cont.end())), or providing begin() and end() methods to your class, effectively making it a range.

Upvotes: 4

Related Questions