Bonjour à tous,
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string -
le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
Bonjour à tous,
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string -
le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :
Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
Bonjour à tous,
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string -
le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :
Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Salut tous, salut Arnaud,C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Salut tous, salut Arnaud,
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...
Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :
Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Salut tous, salut Arnaud,C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string - le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Le 2- tend à ce que le nom soit stoqué dans les objets Entite,
par exemple :
class Entite {
string name;
...
}
Mais dans ce cas, il y a la duplication de donnée.
Mon programme est ammené à manipuler un grand nombre d'entité,
et par suite un grand nombre de noms. Les noms peuvent être
longs.
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Plus généralement, quel solution de conception 'typique'
proposeriez vous pour traiter ce problème, à savoir :
optimiser à la fois l'accès par nom à une entité et l'accès au
nom d'une entité donnée, sans dupliquer les données ?
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string - le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Le 2- tend à ce que le nom soit stoqué dans les objets Entite,
par exemple :
class Entite {
string name;
...
}
Mais dans ce cas, il y a la duplication de donnée.
Mon programme est ammené à manipuler un grand nombre d'entité,
et par suite un grand nombre de noms. Les noms peuvent être
longs.
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Plus généralement, quel solution de conception 'typique'
proposeriez vous pour traiter ce problème, à savoir :
optimiser à la fois l'accès par nom à une entité et l'accès au
nom d'une entité donnée, sans dupliquer les données ?
dans mon appli, j'ai besoin à la fois de :
1 - accéder rapidement à des entités (classe Entite) par nom
(string - le nom est unique)
2 - récupérer le nom de ces entités lorsque je manipule une
Entitie
Le 1- tend à ce qu'une std::map soit utilisée, par exemple :
map<const string , Entite*, ltstr> nameSpace;
Le 2- tend à ce que le nom soit stoqué dans les objets Entite,
par exemple :
class Entite {
string name;
...
}
Mais dans ce cas, il y a la duplication de donnée.
Mon programme est ammené à manipuler un grand nombre d'entité,
et par suite un grand nombre de noms. Les noms peuvent être
longs.
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Plus généralement, quel solution de conception 'typique'
proposeriez vous pour traiter ce problème, à savoir :
optimiser à la fois l'accès par nom à une entité et l'accès au
nom d'une entité donnée, sans dupliquer les données ?
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Une solution consisterait à stoquer dans Entite un iterator sur la map :
class Entite {
map<string, Entite *>::iterator name;
...
}
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
(au cas où, je suis toujours preneur d'info sur les liens entre les
specifs des conteneurs de la std et celles de la stl !)
NicoSalut tous, salut Arnaud,C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Une solution consisterait à stoquer dans Entite un iterator sur la map :
class Entite {
map<string, Entite *>::iterator name;
...
}
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
(au cas où, je suis toujours preneur d'info sur les liens entre les
specifs des conteneurs de la std et celles de la stl !)
Nico
Salut tous, salut Arnaud,
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...
Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)
Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :
Map has the important property that inserting a new element into a
map
does not invalidate iterators that point to existing elements.
Erasing
an element from a map also does not invalidate any iterators,
except,
of course, for iterators that actually point to the element that
is
being erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Je cherche donc à optimiser ces deux actions, sans dupliquer l'info.
Une solution consisterait à stoquer dans Entite un iterator sur la map :
class Entite {
map<string, Entite *>::iterator name;
...
}
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
J'ai refait mes tests, puis inclu ça dans le programme, et tout semble
se passer correctement.
Merci, donc !
(au cas où, je suis toujours preneur d'info sur les liens entre les
specifs des conteneurs de la std et celles de la stl !)
NicoSalut tous, salut Arnaud,C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Sur std de gcc, Linux, RedHat Enterprise. Rien que du très commun.
Es-tu sur que la norme relative aux conteneurs de la librairie standard
std garantisse la non-invalidation des iterator des map en cas d'ajout
et de suppression ?
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix fait
pour la STL.
Aurais-tu un pointeur sur la 'norme' à laquelle tu fais référence ?
Sinon, bien sur, il est possible que ma série de tests soit bugguée. Je
vais verifier ça.
Nico
Sinon...Nicolas Castagne wrote:
...
Ou plutôt std::map<std::string, Entite>
oué c'était une erreur :)Dans la STL de SGI, cela semble possible, puique la doc de stl::map
précise :Map has the important property that inserting a new element into a
mapdoes not invalidate iterators that point to existing elements.
Erasingan element from a map also does not invalidate any iterators,
except,of course, for iterators that actually point to the element that
isbeing erased.
(from : http://www.sgi.com/tech/stl/Map.html )
C'est une garantie donnée par la norme, et que toute implémentation
doit respecter. Sur quelle implémentation as tu observé un
comportement différent?
Arnaud
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix
fait pour la STL.
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix
fait pour la STL.
Parce que la STL de SGI le garantit, mais ce n'est pas une 'norme'...
A priori, sauf erreur, rien n'indique que std respectent les choix
fait pour la STL.