Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Quel conteneur choisir ?

21 réponses
Avatar
jeremie fouche
Bonjour

Je ne sais pas quel conteneur choisir pour les exigences suivantes :
- Un Element possede plusieurs Attribute
- Un Attribut possede un Name et une Value
- L'ordre des Attribut dans Element est important
- 2 Attributes ayant le meme Name est interdit.

Premiere approche : std::map<Attribute::Name, Attribute>
Pour assurer l'unicité d'un attribut donnée, c'est nickel, mais il sont
forcement rangé dans l'ordre alphabetique.

Deuxieme approche : std::list<Attribute>
Pour l'ordre, c'est nickel, par contre, pour assurer l'unicité d'un
Attribute, il faut se taper a chaque ajout une recherche dans la list
afin de verifier qu'un Attribute ayant le même Name n'existe pas. BOF aussi.
D'ailleurs, je ne sais pas trop si vector<> et list<> ici ne sont pas
équivalent ?

Troisieme approche : Un joyeu combiné des 2 solutions précedentes :
- std::map<Attribute::Name, Attribute>
- std::list< std::map<Attribute::Name, Attribute>::const_iterator >
ou std::list< std::map<Attribute::Name*>

J'ai pas testé, mais je pense que cela fonctionne. Ca me parrait juste
un poil lourd pour ce que je veux faire, non ?

Quatrieme approche : std::map<Attribute::Name, Attribute, ????>
Rajouter un predicat qui n'est pas std::less<std::string> (par defaut),
mais un autre qui ne change pas l'ordre d'insertion dans la map. C'est
possible ca ?

Des idées ?
Merci
--
Jérémie

1 réponse

1 2 3
Avatar
Michael DOUBEZ
Les fonctions succeptibles d'ête O(n) sont entre autre size(), swap()et
max_size()


Aucunement. La norme est très formelle là-dessus : ces trois
fonctions doivent avoir une complexité constante. (Dans le cas
de swap(), il y a énormement de code qui en dépend.)


swap au moins deviens en O(n) lorsque get_allocator() est différent (ce
qui est rare c'est vrai).

A par cela, un "should"/"shall" n'est pas un "must". En pratique
X::swap() ne devrait être spécialisé pour un container ssi il fonctionne
en o(1) - ce qui est le cas pour les container de la STL. Mais, pour
autant que je sache, ce n'est pas garanti stricto-sensus par le standard.

AMA, de la même façon que list<>::size() est devenu O(n), une
implémentation de vector<>::size() en O(n) serait à priori standard.

Enfin cela a pas beaucoup d'importance vu que ce serait vicieux et que
la pratique fait que l'implémentation en temps constant est directe
(sauf pour list<>).

Michael


1 2 3