OVH Cloud OVH Cloud

implementer un iterateur de X sur un std::vector< std::vector >

31 réponses
Avatar
meow
Tout est dit dans le titre.
Pour faire court j'ai une classe qui contient un vector< vector X >
(o=F9 X est une classe) et j'aimerai it=E9rer sur tous les X contenus
dans ce vecteur de vecteurs. Je m'interroge donc sur la meilleure
fa=E7on de faire. J'imagine que la probl=E9matique est classique mais je
n'ai rien trouv=E9 sur le sujet.

On m'a souffl=E9 une solution facile : ma classe it=E9rateur contiendrait
un vector< X >, mise =E0 plat du vector<vector<X>> ainsi qu'un
it=E9rateur sur ce vecteur (appellons le it).
Je d=E9finirais alors mes op=E9rateurs ++, * et Cie simplement en les
d=E9l=E9guants =E0 it (i.e le ++ de mon it=E9rator fait juste un ++it, et
le * renvoie *it).

Cette solution me parrait lourdingue : si les vector<X> contiennent
beaucoup de X, mon it=E9rateur va bouffer beaucoup de m=E9moire. En
outre, contrairement aux it=E9rateurs de la stl, si ma structure tombe,
mon it=E9rateur continue =E0 etre valide (est-ce important ? Je suppose
que =E7a l'est si je veux faire des delete, replace, remove etc... mais
sinon ?) J'ai donc pens=E9 =E0 une autre solution :

dans mon_iterateur je stockerais un tableaux de paires d'it=E9rateurs
sur X. Chaque paire =E9tant constitu=E9e d'un it=E9rateur sur le d=E9but et
d'un it=E9rateur sur la fin d'un =E9l=E9ment de mon vector<vector<X>>.
J'aurai en outre encore un it=E9rateur sur mon vecteur de paire.
en gros :
class mon_iterateur {
vector<pair<vector<X>::iterator,vector<X>::iterator>> ;
vector<pair<vector<X>::iterator,vector<X>::iterator>> it;
.=2E.
mon_iterateur& operator++ {
if ((*it).first =3D=3D (*it).second) ++it else ++(*it);
return *this;
}
.=2E.
};

=E7a vous semble correct ? y a t'il mieux ?

1 réponse

1 2 3 4
Avatar
Marc Boyer
Le 17-01-2007, Fabien LE LEZ a écrit :
On Wed, 17 Jan 2007 12:23:34 +0000 (UTC), Marc Boyer :

Ceci dit, rien dans la norme n'empèche donc un compilo
de spécialiser "comportement indéfini" en quelque chose de
défini.


Certes. Mais ça m'étonnerait qu'un éditeur de compilo soit capable de
prévoir tous les cas.


Je ne m'amuserais pas à relire la norme et à traquer toutes les
sources de comportements indéfinis, mais tous ceux auxquels je
pense spontanément, je peux imaginer un moyen de les rendre
déterministe (à un coû élevé, certe...)

std::vector<int> v;
++v[0];

Selon la norme, le comportement est indéfini.
Sous VC++ en mode "release", idem.
Sous VC++ en mode "debug", le comportement est parfaitement défini. Je
ne m'en souviens plus, mais il me semble que c'est un abort().


Pas trop compliqué à faire celui là, surtout qu'il faut implanter
'at(int)' de toute façon...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


1 2 3 4