© D. Mathieu
mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 11/01/2001 -
Dernière mise à jour : 16/01/2001
Constructeur par défautAccesseurs/modifieurs d'un vector
Constructeur par recopie
Classes d'itérateursFonctions et opérateurs utilisant les itérateurs
Accès à un élément désigné par un itérateur
Valeurs particulières d'itérateurs
ConstructeurVoir aussi :
Modifieurs
class CPoint;
// déclaration d'une classe CPoint supposée
// définie par ailleurs; vector <int> VInt; // définition d'un vecteur d'int (type anonyme) vector <CPoint> VCPoint; // définition d'un vecteur de CPoint (type anonyme) typedef vector <int> CVInt;
// défintion d'un type de vecteur d'int
(type nommé)
CVInt VectInt;
// définition d'un vecteur d'int
|
Comme le montrent ces exemples, l'instanciation de la classe vector nécessite un seul [1] paramètre de généricité (entre <>). Il et vivement conseillé de définir un type nommé dès qu'une instanciation est nécessaire. Nous n'utiliserons plus que les deux types CVInt et VectCPoint définis ci-dessus dans tous les exemples qui suivent.
Le constructeur utilisé ci-dessus est le constructeur par défaut (qui peut être appelé sans paramètre), qui crée un vecteur vide (aucun élément). Cependant le conteneur vide existe : il occupe un espace mémoire.
Il est possible de construire un vecteur de taille
non nulle :
CVInt VectCpt (10);
CVCPoint VectCPoint ( 5); |
VectCpt est un vecteur de 10 éléments entiers initialisés chacun par le constructeur par défaut du type int, qui correspond à une valeur nulle. En d'autres termes, les 10 compteurs du vecteur sont initialisés à 0.
CVCPoint est un vecteur de 5 points initialisés chacun par le constructeur par défaut de la classe CPoint, qui peut par exemple initialiser à 0 les coordonnées du point à 0.
De façon générale, l'utilisation de ce constructeur nécessite que le type des éléments du vecteur possède un constructeur par défaut qui sera utilisé pour initialiser chacun des éléments du vector.
Il est possible d'intialiser tous les éléments du vecteur à valeur particulière, en utilisant le second paramèter du constructeur :
CVInt VectCpt (10, 5);
// initialisation des 10 éléments du vecteur à 5
CVCPoint VectCPoint (CPoint (10, 10)); // initialisation des 5 éléments du vecteur à // par un point de coordonnées {10, 10} |
CVInt NewVectCpt (VectCpt); |
Remarque : Si la nouvelle taille du vector indiquée par la fonction resize() est supérieure à la taille courante, le vecteur est allongé du nombre d'éléments supplémentaires et le constructeur par défaut du type de ces éléments est appelé pour chacun d'eux. Il est donc nécessaire que la classe des éléments du vector ait un constructeur par défaut.
front() | renvoie la valeur du premier élément du vecteur |
back() | renvoie la valeur du dernier élément du vecteur |
[n] | accède à l'élément de rang n (en lecture ou en écriture) |
at(n)[2] | accède à l'élément de rang n (en lecture ou en écriture) |
push_back (x) | ajoute la valeur x en fin de vecteur |
pop_back () | supprime le dernier élément du vecteur |
VCPoint = VectPoint; |
ou
VCPoint.assign (VectPoint); |
< == != > >= <= |
De même, la fonction non membre swap()
permet de permuter efficacement deux vecteurs de même type :
swap (V1, V2); |
Exemples de déclarations :
CVInt::iterator
IterInt;
CVCPoint::const_reverse_iterator RevIterPoint; |
IterInt est un itérateur susceptible de parcourir un vecteur d'entiers, RevIterPoint est un itérateur susceptible de parcourir un vecteur de points (sans pouvoir les modifier).
*IterInt;
*RevIterPoint; |
pourvu que les deux itérateurs soient initialisés.
begin() | renvoie un (const_) iterator permettant d'accéder au premier élément du vecteur |
end() | renvoie un (const_) iterator désignant une position au-delà du dernier élément du vecteur |
rbegin() | envoie un (const_) iterator permettant d'accéder au dernier élément du vecteur |
rend() | renvoie un (const_) iterator désignant une position en-decà du premier élément du vecteur |
for (CVInt::iterator IterInt (VInt.begin()); // Accès
au premier élément
IterInt != VInt.end (); // Dépassement du dernier élément ++IterInt) // Passage à l'élément suivant cin >> *IterInt; |
ou
typedef CVCPoint::const_reverse_iterator CCRIter;
for (CCRIter RevIterPoint (VPoint.rbegin()); // Accès
au dernier élément
|
CVInt NewVect (ItFirst, ItLast); |
ItFirst et ItLast doivent être des itérateurs sur le même vecteur ! Les éléments sont recopiés l'un après l'autre dans le nouveau vecteur à partir de ItFirst (inclus) jusqu'à ItLast (exclu).
Attention : si les itérateurs sont des reverse_iterators, les éléments sont donc rangés dans l'ordre inverse dans le nouveau vecteur.
VInt.insert (IterInt, x);
// {1}
VInt.insert (IterInt, n, x); // {2} VInt.insert (IterInt, ItFirst, ItLast); // {3} |
{1} : insère dans le vecteur VInt la valeur entière x devant l'élément désigné par IterInt et renvoie un itérateur qui désigne la nouvelle valeur
{2}: insère dans le vecteur VInt n fois la valeur entière x devant l'élément désigné par IterInt et ne renvoie rien
{3} : insère dans le vecteur VInt la tranche d'un vecteur entier désignée par [ ItFirst, ItLast [ devant l'élément désigné par IterInt.
ItFirst et ItLast doivent être des itérateurs sur le même vecteur.
VInt.erase (IterInt);
// {4}
VInt.erase (ItFirst, ItLast); // {5} |
{4} : supprime du vecteur VInt l'élément désigné par IterInt et renvoie un itérateur qui désigne l'élément qui suit l'élément supprimé
{5} : supprime du vecteur VInt la tranche du vecteur entier désignée par [ ItFirst, ItLast [ et renvoie un itérateur qui désigne l'élément qui suit la tranche supprimée.
ItFirst et ItLast doivent être des itérateurs sur le même vecteur.
VInt.assign (ItFirst, ItLast); // {6} |
{6} : affecte au vecteur VInt la tranche d'un vecteur entier désignée par [ ItFirst, ItLast [ et ne renvoie rien.
SGI - Bibliothèque STL :
classe vector
Thinking in C++ - B. Eckel :
vector
[2] La fonction at(n) a le même effet que l'opérateur [n], mais vérifie en plus la validité de l'indice. En cas d'erreur (n >= nombre d'éléments du vecteur), at() lève l'exception out_of_range. La fonction at(n) est facultative (un compilateur peut ne pas l'implémenter).
© D. Mathieu
mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique