
Envoyé par
NiamorH
Pour leur donne-t-on le nom de conteneurs associatifs ?
Une map ou une multimap associe bien une clef à un élément, mais un set est juste un ensemble trié ? Pourquoi l'affubler du nom d'associatif ?
Tu vois peut-être une map<K, D> comme associant une donnée D à la clef K :
1 2 3
| void f (std::map<K, D> &m, K k) {
D d = m[k];
} |
mais c'est plus le point de vue de operator[].
Une map associe un élément à une clef : map<K, D>::element_type étant défini comme pair<const K, D>, map associe pair<const K, D> à K. C'est l'opération effectuée par find, qui est l'opération cruciale (je n'ose dire "opération clef") :
find (k)->first = k
Un set associe K à K :
*find (k) = k
En fait, les deux sont généralement implémentés en terme de rbtree<K, E, Pi>, qui associe un E à K, avec Pi : E -> K, tel que :
Pi()(*find (k)) = k
ce qui permet naturellement de définir set<K> à partir de
rbtree<K, K, Id>
(où Id() est l'identité)
et map<K, D> à partir de
rbtree<K, pair<const K, D>, First>
(avec First()(x) = x.first)
Bien sûr, j'ai simplifié, il y a aussi le comparateur à passer, et un paramètre pour choisir entre conteneur à clef unique (set, map) et conteneur à clef multiples (multiset, multimap).
Les hash_(multi)set/map sont définis pareil, en terme de hashtable<K,E,Pi,etc.>
Malheureusement, rien de tout ça n'est standard, et on doit supporter l'insupportable interface de set et compagnie, garantie "sure pour les bébés".
Partager