Bonjour.

Je souhaiterais avoir un précision sur l'utilisation des itérateurs.

Je code des fonctions qui traitent des données (des points x, y, z) contenues dans un std::vector. Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
void foo(const std::vector<point>& begin, const std::vector<point>& end)
{
   ...
}
Puis j'ai une procédure qui appelle ces fonctions :
- tant qu'on n'est pas interrompu
- acquisition des points
- insertion des points dans le vecteur (push_back)
- appel de la fonction de traitement sur les derniers points insérés
- fin du tant que et rebouclage

Je me suis demandé si je pouvais utiliser l'itérateur .end() obtenu avant les push_back en tant qu'itérateur begin et l'itérateur .end() obtenu après les push_back en tant qu'itérateur end pour appeler ma fonction de traitement.

J'ai donc réalisé ce petit bout de test qui semble fonctionner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <cassert>
#include <iostream>
#include <vector>
 
int main(int argc, char **argv)
{
  std::vector<int> foo;
 
  foo.push_back(1);
  foo.push_back(2);
  foo.push_back(3);
 
  std::vector<int>::iterator i1 = foo.end();
 
  foo.push_back(4);
 
  std::vector<int>::iterator i2 = foo.end() - 1;
  std::vector<int>::iterator i3 = foo.end();
 
  assert(i1 == i2);
  assert((i1 + 1) == i3);
 
  std::cout << *i1 << std::endl;
 
  return 0;
}
Ma question est : est-ce l'implémentation qui fait que ça marche, ou est-ce un comportement décrit dans le standard ?

Je trouve en particulier douteux qu'un itérateur qu'on a obtenu avec end() à un moment ne soit pas le même après insertion de nouveaux éléments...

Merci pour votre aide.