Cours STL
Cours STL
Cours STL
•list : cette classe implémente une liste doublement chaînée. Avec cette
classe, il est plus facile de supprimer un élément particulier par rapport au
vecteur (en effet pour un vecteur, si nous supprimons une case, il est
nécessaire de décaler les cases suivantes vers le bas). Par contre, cette liste
utilise systématiquement deux pointeurs pour parcourir la séquence ce qui
prend plus de place en mémoire.
•deque : cette classe est très peu utilisée et offre le même comportement
mais plus spécialisé que la classe vecteur. Sa spécialisation consiste à pouvoir
facilement ajouter ou retirer le premier élément. Cette classe est une
abstraction d'une file pour laquelle le premier élément est retiré chaque fois.
Adaptateurs de conteneurs séquentiels :
La bibliothèque standard dispose de trois patrons particuliers qui
s'ajoutent aux conteneurs séquentiels en modifiant leurs
comportements classiques. Généralement, il s'agit d'une restriction
et d'une adaptation à des fonctionnalités données :
•append : ajoute une chaîne, à la fin d'une autre. Il s'agit d'une concaténation qui peut
être également traitée par l'opérateur += .
•assign : affecte à l'objet une nouvelle chaîne de caractères.
•at : permet de lire ou de récupérer un caractère à la position indiquée. La première
position est 0. Il est nécessaire de donner une position compatible et inférieure à la
taille de la chaîne sinon une exception est levée. Cette méthode est similaire à la
redéfinition de l'opérateur « [ ] ».
•capacity : retourne la dimension du bloc mémoire réservé. Cette méthode fournit donc
le nombre maximal de caractères qu'on pourra introduire, sans qu'il soit besoin de
procéder à une nouvelle allocation mémoire. Les méthodes reserve et resize pouront
être utilisée pour agir directement sur la capacité de ce bloc mémoire. La valeur
retournée est toujours plus grande ou égale à la valeur que retourne la méthodesize.
•clear : vide entièrement la chaîne de caractères.
•compare : cette méthode gère l'ordre alphabétique et retourne une valeur numérique
négative ou positive suivant le placement de la chaîne par rapport à celle qui est passée
en argument. Une valeur négative indique que la chaîne se trouve avant celle qui est
passée en argument. Une valeur positive dans le cas contraire, et une valeur nulle dans
le cas où les deux chaînes sont rigoureusement identiques. La plupart du temps, il sera
préférable d'utiliser les opérateurs relationnels « <, <=, ==, !=, >, >= » pour gérer ce
genre de problème.
•c_str : cette méthode permet de passer d'une chaîne de type « string » vers une chaîne
classique du C++ (const char *). Attention, il est possible de récupérer cette chaîne sans
toutefois pouvoir la modifier puisque une constante est déclarée.
•empty : retourne true si la chaîne est vide (sans aucun caractère), sinon retourne false .
•erase : efface une partie de la chaîne ou un caractère spécifié en argument.
•find, rfind, find_first_of, find_last_of, find_first_not_of, find_last_not_of : effectuent des
recherches sur une partie de la chaîne ou sur un caractère spécifié en argument.
•insert : permet d'insérer une autre chaîne ou bien un ou plusieurs caractères donnés.
•length : retourne la longueur de la chaîne de caractères. Similaire à la méthode size.
•replace : remplace une partie de chaîne.
•reserve : réserve un bloc mémoire dont la taille est fixé par l'argument. Cette méthode
doit être rarement utilisé, juste dans le cas où la performance en terme de rapidité est
primordiale ou alors, éventuellement, dans le cas où nous sommes très limité dans la
capacité de la mémoire.
•resize : donne une nouvelle dimension à votre chaîne de caractères. Attention ! à utiliser
avec beaucoup de précaution.
•size : retourne la longueur d'une chaîne de caractères. Similaire à length.
•substr : retourne une partie de chaîne.
•swap : assure la permutation de deux chaînes de caractères.
•begin et end : ces opérations retournent des itérateurs au début et à la fin de la chaîne.
Un itérateur est une abstraction d'un pointeur de classe générique, fourni par la
bibliothèque standard. Ce sujet sera traité ultérieurement lorsque nous utiliserons la
classe « vector ».
La classe vector en tant que tableau - #include <vector>
nous avons besoin d'une classe qui palie au manque de
compétence du langage C++. La classe vector sera presque
systématiquement utilisée pour implémenter les tableaux.
Toutefois, la classe vector représente bien plus que cela.
Elle fait également partie de l'ensemble des conteneurs, et
notamment des conteneurs de type séquentiel.
Le tableau vector
La classe vector remplace aisément les tableaux classiques
en offrant des manipulations simples et intuitives. Ainsi, il
est possible de construire des tableaux de type
quelconque, en indiquant le nombre de cases requis. Il est
également possible d'initialiser un tableau avec une valeur
particulière pour toutes les cases du tableau ou même de
spécifier une valeur d'initialisation différente pour chacune
des cases du tableau.
Avec ce tableau, un certain nombre d'opérations peuvent
être réalisées simplement, comme :
•= : l'affectation est possible entre deux tableaux de même type (Attention,
il faut aussi qu'ils comportent le même nombre de cases).
•[ ] : l'opérateur d'indexation à bien évidemment été redéfini pour
supporter le comportement classique d'un tableau, puisque cet opérateur à
été spécialement créé pour les tableaux.
•==, !=, <, <=, >, >= : Il est de plus possible de comparer le contenu de deux
tableaux entre eux en utilisant les opérateurs classiques de comparaison.
Vu la simplicité d'utilisation, il est impératif d'utiliser cette classe pour
implémenter les tableaux.
Propriétés communes aux conteneurs séquentiels vector, list, deque
Itérateur et parcours d'un conteneur
Un itérateur fournit un processus général pour accéder successivement
à chaque élément à l'intérieur de n'importe quel type de conteneur. Un
itérateur correspond à un pointeur qui, comme tous les pointeurs,
permet d'utiliser l'incrémentation ou la décrémentation. Ainsi, il est
possible de consulter dans le sens direct ou en sens inverse une suite
d'éléments faisant partie de la séquence.
•Un itérateur peut être incrémenté par l'opérateur « ++ », de manière à pointer sur
l'élément suivant du même conteneur.
•Un itérateur peut être déréférencé par l'opérateur « * » ; nous pouvons donc
récupérer la valeur de l'élément de la séquence.
begin() : retourne un itérateur qui adresse le premier élément du conteneur,
end() : retourne un itérateur qui adresse un élément après le dernier élément du
conteneur.
Constructions
Ces trois classes disposent de plusieurs constructeurs qui
permettent de résoudre la plupart des situations envisagées :