Re: List iterator and the next element
 
Boon wrote:
Hello everyone,
Consider a list of integers: 1 2 3 4 5
I want to print every pair (v(i),v(j)) where i < j
With a plain old array, I'd write something along the lines of
#include <stdio.h>
#define N 5
int main(void)
{
  int i, j, v[N];
  for (i=0; i < N; ++i) v[i] = i+1;
  for (i=0; i < N; ++i)
    for (j=i+1; j < N; ++j)
      printf("(%d,%d)\n", v[i], v[j]);
  return 0;
}
but I need to be able to remove elements in the middle of the list, and 
reinsert them later. Therefore, I thought I'd use an std::list.
#include <list>
#include <cstdio>
#define N 5
typedef std::list<int> int_list;
int main(void)
{
  int i;
  int_list v;
  int_list::iterator it1, it2;
  for (i=0; i < N; ++i) v.push_back(i+1);
  for (it1=v.begin(); it1 != v.end(); ++it1)
    for (it2=it1+1; it2 != v.end(); ++it2) // ILLEGAL
             ^^^^^
      printf("(%d,%d)\n", *it1, *it2);
  return 0;
}
AFAIU, an std::list iterator is not a Random Access Iterator, thus 
"it1+1" is invalid. Is this correct?
How can I say "initialize it2 to something that points to the next 
element after that pointed to by it1" ?
For the moment, I've settled for
    for (it2=it1, ++it2; it2 != v.end(); ++it2)
but I find it ugly.
Wrap it in a function:
    template<class It> It next_after(It const& it) {
       It next_it = it;
       return ++next_it;
    }
and do
    for (it2 = next_after(it1); it2 != v.end(); ++it2)
..  Is that better?
V
-- 
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask