• Aucun résultat trouvé

CHAPITRE 4 : LA MÉTAPROGRAMMATION

4.7 La Standard template librairie

Le STL est une bibliothèque métaprogrammée qui fournit des solutions à la gestion des collections de données avec des algorithmes génériques [28,48,58]. Elle permet aux pro-grammeurs de bénéficier de structures de données et des algorithmes qui font référence dans le paysage C++ moderne. Tous les composants du STL sont des templates, de sorte qu’ils peuvent être utilisés pour des types d’éléments arbitraires.

4.7.1 Les composants de la STL

Le STL est basé sur la coopération de divers composants structurés autour des concepts de découplage des conteneurs, des itérateurs et des algorithmes [28] :

4.7.1.1 Les itérateurs

Les itérateurs sont utilisés pour parcourir les éléments de collections d’objets. Ces collec-tions peuvent être des conteneurs ou des sous-ensembles de conteneurs.

Chapitre 4 : La métaprogrammation

L’interface pour les itérateurs est presque la même que pour les pointeurs ordinaires. Pour incrémenter un itérateur, on fait appel à l’opérateur ++. Pour accéder à la valeur d’un ité-rateur, on utilise l’opérateur *.

Ainsi, on peut considérer un itérateur à l’instar des pointeurs inteligents comme une abs-raction au pointeurs qui ont la capacité de parcourir une structure de données par des déplacements (élément suivant , élément précedent , dernier élément et premier élément" [28,53].

4.7.1.2 Les Algorithmes

Les algorithmes agissent sur les conteneurs. Ils fournissent les moyens par lesquels les opé-rations d’initialisation, de tri, de recherche et de transformation du contenu des conteneurs sont effectués. Le concept de STL repose sur une séparation des données et des opérations. Les données sont gérées par des classes conteneur, et les opérations sont définies par des algorithmes configurables. Les itérateurs sont le lien entre ces deux composants (conte-neurs et algorithmes). Ils autorisent ainsi à n’importe quel algorithme d’interagir avec tous les conteneurs de la STL [53].

4.7.2 Les conteneurs standards

Les conteneurs sont des objets support qui stockent une collection d’autres objets (leurs éléments). Ils sont implémentés en tant que modèles génériques, ce qui permet une grande flexibilité dans les types pris en charge [48].

Le conteneur gère l’espace de stockage pour ses éléments et fournit des fonctions membres pour y accéder, soit directement, soit via des itérateurs . Pour répondre aux différents besoins liés aux mises en oeuvres d’algorithmes réguliers et irréguliers , la STL fournit différents types de conteneurs, parmi lesquels on trouve :

4.7.2.1 Les conteneurs de séquence

Les conteneurs de séquence sont des collections ordonnées dans lesquelles chaque élément a une certaine position. Cette position dépend du moment et du lieu de l’insertion, mais elle est indépendante de la valeur de l’élément. Par exemple, si on place six éléments dans une collection ordonnée en ajoutant chaque élément à la fin de la collection, ces éléments sont dans l’ordre exact où on vient de les placer. La STL contient cinq classes de conteneurs de séquences prédéfinies : vector, array , deque, list et forward_list.

• std : :vector est un conteneur séquentiel qui représente les vecteurs à une dimen-sion c++ de taille dynamique ,la taille du vecteur peut être augmentée ou dimi-nuée automatiquement. Ses éléments sont stockés de façon contigüe, et accessibles non seulement via les itérateurs, mais aussi à partir des pointeurs C. Les vecteurs (std : :vector) occupent généralement plus d’espace que les tableaux statiques, du fait que de la mémoire supplémentaire est allouée pour anticiper un accroissement future. Ainsi, un vecteur std : :vector n’a pas besoin de ré-allouer la mémoire chaque fois qu’un élément est inséré, mais seulement lorsque la mémoire additionnelle est épuisée.

La complexité (efficacité) des opérations courantes sur les vector sont les suivantes :

1. Accès aléatoire - constante O(1)

2. Insertion ou suppression d’éléments à la fin - O(1)

3. Insertion ou retrait d’éléments - linéaire O(n)

• std : :array est un conteneur séquentiel qui représente des vecteurs de taille constante. Cette structure possède la même sémantique de type agrégat (il n’a pas de construc-teurs et aucun membre en privé ou protégé) qu’un tableau de style C. La taille et l’efficacité de array<T,N> pour un certain nombre d’éléments sont équivalentes à celles du tableau T[N] de style C correspondant.

Chapitre 4 : La métaprogrammation

• std : :deque cette structure offre les avantages d’un conteneur standard, et implé-mente la sémantique des itérateurs à deque (Queue à double entrées), elle est un conteneur de séquence indexées qui permet une insertion et suppression rapide à ses extrémités. Par opposition à std : :vector, les éléments d’une file double ne sont pas stockés de façon contiguë : typiquement chaque élément du tableau est alloué dans un espace mémoire séparé , ainsi il évite les opérations de copies mémoires et les dé-placements de zones couteuses en temps et en mémoire lors du redimensionnement du conteneur.

1. La complexité des opérations communes sur deques est la suivante :

2. Accès aléatoire O(1) constante

3. Insertion ou suppression d’éléments à la fin ou au début -O(1)

4. Insertion ou suppression d’éléments à un emplacement quelconque O(n) li-néaire

• std : :list & std : :forword_list : sont deux conteneurs séquentiels implémentés pour fournir respectivement une implémentation standard des chaines doublement et simplement liées , ils supportent tous deux l’insertion et la suppression des élé-ments en temps constant, et à l’instar de deque, chacun des éléélé-ments des listes est stocké dans une zone mémoire séparée . Cependant l’accès aléatoire n’est pas pris en charge et seul un parcourt linéaire est supporté.

4.7.2.2 Les conteneurs associatifs

Les conteneurs associatifs sont des collections triées dans lesquelles la position d’un élé-ment dépend de sa valeur (ou clé, si c’est une paire clé / valeur) en raison d’un certain critère de tri. Si on construit une collection associative composée de six éléments, leurs

valeurs déterminent leur ordre. L’ordre d’insertion n’a pas d’importance. Le STL contient quatre classes de conteneurs associatifs prédéfinis : set, multiset, map et multimap.

• std : :set & std : :multiset : std : :set est un conteneur associatif qui contient un ensemble trié d’objets de type clé. Tandis que Std : :multisets sont des conteneurs qui stockent des éléments suivant un ordre spécifique et où plusieurs éléments peuvent avoir des valeurs équivalentes,cependant, la valeur des éléments dans un multiset ne peut pas être modifiée une fois dans le conteneur (les éléments sont toujours const), mais ils peuvent être insérés ou retirés du conteneur.

• std : :map & std : :multimap std : :map est un conteneur trié associatif contenant les paires clé-valeur avec une clé unique, tandis que le multimap est un conteneur associatif qui stocke également des éléments formés de paires clé-valeur, mais avec la particularité qu’un où plusieurs éléments peuvent avoir une même clé.

Documents relatifs