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 :
Puis j'ai une procédure qui appelle ces fonctions :
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) { ... }
- 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.
Ma question est : est-ce l'implémentation qui fait que ça marche, ou est-ce un comportement décrit dans le standard ?
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; }
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.
Partager