This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
cpp:syntax:stl:container [2021/04/07 08:13] bmonsuez [La philosophie derrière les containeurs] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Les containers dans la STL ====== | ||
- | |||
- | Dans la STL est appellé "container" une classe qui stocke plusieurs éléments d'un même type. | ||
- | |||
- | ===== La philosophie derrière les containeurs ===== | ||
- | |||
- | L'objectif est de fournir une interface commune à l'ensemble des classes qui propose de stocker une collection d'éléments d'un type donné. Cette uniformisation passe par certaines règles de fonctionnement. | ||
- | |||
- | __**Règle n°1**__ : Le containeur est responsable de l'allocation de la mémoire pour stocker les données dans le containeur. | ||
- | |||
- | Quand on ajoute un élément à un containeur, le containeur va créer la mémoire nécessaire pour stocker l'objet et va recopier l'objet passé dans ce nouvel emplacement mémoire en utilisation le constructeur ou l'opérateur de recopie. | ||
- | |||
- | Quand on détruit un élément du containeur, l'objet est détruit et son constructeur est appelé. | ||
- | |||
- | Enfin, cette règle a une conséquence importante, quand le containeur est détruit, tous les éléments qui sont dans le containeur sont détruits. | ||
- | |||
- | __**Règle n°2**__ : Chaque containeur offre la possibilité d'énumérer l'ensemble des éléments stockés dans le containeur sans avoir à connaitre les détails d'implantation du containeur. | ||
- | |||
- | Cette énumération s'effectue en parcourant la structure interne en utilisant ([[cpp:stl:iterator|des itérateurs]]. Chaque collection va offrir les méthodes suivantes : | ||
- | |||
- | | ''begin()'' | retourne un itérateur sur le premier élément situé dans le containeur .| | ||
- | | ''end()'' | retourne un itérateur indiquant la fin de l'énumeration.| | ||
- | | ''rbegin()'' | retourne un itérateur sur le dernier élément situé dans le containeur pour énumérer les élément en débutant par le dernier élément de la collection.| | ||
- | | ''rend()'' | retourne un itérateur indiquant la fin de l'énumeration débutant par le dernier élément situé dans le containeur.| | ||
- | |||
- | |||
- | |||
- | |||
- | Nous retrouvons parmi les classes containers de la STL l'ensemble des structure de données habituelles correspondant à des séquences d'éléments ou au contraire des dictionnaires. | ||
- | |||
- | |||
- | ===== Les containers par type ===== | ||
- | |||
- | * Séquence d'éléments | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/array|array]] un tableau statique (de taille fixe). | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/vector|vector]] un tableau dynamique (de taille variable). | ||
- | |||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/vector|vector]] une structure permettant l'insertion ou la suppression rapide des éléments soit au début soit à la fin de la séquence. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/forward_list|forward_list]] une liste simplement chaînée. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/forward_list|list]] une liste doublement chaînée. | ||
- | |||
- | * Les séquences d'éléments ordonnés | ||
- | |||
- | Dans ce cas, les éléments stockés dans la structure sont ordonnés. L'énumération des éléments dans ce cas retourne les éléments en débutant par le plus petit et allant jusqu'au plus grand. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/set|set]] un ensemble d'éléments ordonnés. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/map|map]] un dictionnaire dont les éléments sont référencés et ordonnées par rapport à une clé qui identifie chaque élément. Cette structure supporte plusieurs occurences d'un même élément. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/multiset|multiset]] un ensemble d'éléments ordonnés. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/multimap|multimap]] un dictionnaire dont les éléments sont référencés et ordonnées par rapport à une clé qui identifie chaque élément. Cette structure supporte plusieurs occurences d'un même élément. | ||
- | |||
- | * Les séquences d'éléments non-ordonnés | ||
- | |||
- | Dans ce cas, les éléments stockés dans la structure ne sont pas ordonnés. L'énumération des éléments dans ce cas retourne les éléments dans un ordre arbitraire dépendant de l'implantation. Les implantations standards utilisent des fonctions de hashages pour générer offrir un accès rapide aux données. | ||
- | |||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/unordered_set|unordered_set]] un ensemble d'éléments ordonnés. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/unordered_map|unordered_map]] un dictionnaire dont les éléments sont référencés et ordonnées par rapport à une clé qui identifie chaque élément. Cette structure supporte plusieurs occurences d'un même élément. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/unordered_multiset|unordered_multiset]] un ensemble d'éléments ordonnés. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/unordered_multimap|unordered_multimap]] un dictionnaire dont les éléments sont référencés et ordonnées par rapport à une clé qui identifie chaque élément. Cette structure supporte plusieurs occurences d'un même élément. | ||
- | |||
- | * Les adaptateurs | ||
- | |||
- | Un adaptateur fournit une surcouche qui ajouter à un containeur gérant des sequences d'éléments une interface pour utiliser cette structure comme une pile, une queue ou une queue avec priorité. | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/stack|stack]] offre une interface de type pile (structure LIFO). | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/queue|queue]] offre une interface de type queue (structure FIFO). | ||
- | |||
- | [[https://en.cppreference.com/w/cpp/container/priority_queue|priority_queue]] offre une interface de type queue avec priorité. | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||