Re: Access the next item (std::list)
Jack wrote:
std::list<FINFO>::iterator iter;
What is this FINFO macro?
for (iter = moveList.begin(); iter != moveList.end();iter++)
Why are you repeatedly calling moveList.end()? Suggestion:
for( list<FINFO>::iterator it=moveList.begin(), end=moveList.end();
it!=end;
++it)
Notes:
- Initialise the range (begin, end) once only.
- Use prefix increment.
- Declare loop variables inside the loop header.
{
MakeStraightLine(curStart.pos, iter->next->pos...
<< fails this one
}
error C2227: left of '->pos' must point to class/struct/union/generic type
What is the 'next' field of the type that the FINFO macro resolves to?
I wanted to be able to do
MakeStraightLine(curStart.pos, *(iter+1)->pos...
of some form like this.
Firstly, that would be broken, because when you are at the last element of
the sequence, there is no next element.
Is it possible to access the 'next' item when the iterator is pointing to
the 'current' item?
Not as you would like to. You can always copy the iterator and advance that
temporary copy, you could also write a function that does that (Boost
includes one, too).
Alternatively, you could write an iterator that operates on the sequence and
yields two points each.
struct line_range {
line_iterator(list<FINFO>::iterator begin, list<FINFO>::iterator end);
// check if there is a current and next point
bool empty() const;
// access current and next point
FINFO& current() const;
FINFO& next() const;
// advance
void pop();
};
for( line_range line(moveList.begin(), moveList.end());
!line.empty();
line.pop())
{
...
}
Note that this isn't strictly an iterator but rather a 'range', which
provides a generally more useful and safe interface but is otherwise the
same as a pair of iterators.
Uli
--
C++ FAQ: http://parashift.com/c++-faq-lite
Sator Laser GmbH
Gesch?ftsf?hrer: Thorsten F?cking, Amtsgericht Hamburg HR B62 932