Classe et objets
Une classe est un ensemble de variables et de fonctions qui fonctionnent ensemble, où les variables n'ont pas de valeurs attribuées. Lorsque des valeurs sont affectées aux variables, une classe devient un objet. Différentes valeurs données à la même classe entraînent différents objets; c'est-à-dire que différents objets peuvent être de la même classe mais ont des valeurs différentes. La création d'un objet à partir d'une classe est également connue sous le nom d'instanciation de l'objet.
Le terme vecteur décrit une classe. Un objet créé à partir d'un vecteur a un nom choisi par le programmeur.
Une fonction qui appartient à une classe est nécessaire pour instancier un objet de la classe. En C ++, cette fonction a le même nom que le nom de la classe. Différents objets créés (instanciés) à partir de la classe ont des noms distincts donnés à chacun d'eux par le programmeur.
La création d'un objet à partir d'une classe signifie la construction de l'objet; Cela signifie également instancier l'objet.
La classe vectorielle
La classe vectorielle a déjà été définie et se trouve dans la bibliothèque. Pour utiliser la classe vectorielle, un programmeur doit inclure l'en-tête vectoriel dans le fichier avec la directive de prétraitement suivante:
#inclure
Une fois l'en-tête inclus, toutes les fonctionnalités vectorielles (membres de données et fonctions membres) deviennent accessibles. Pour utiliser l'objet Count pour sortir des données sur le terminal (console), l'en-tête de l'objet doit également être inclus. Pour écrire un programme avec le vecteur, au minimum, les en-têtes suivants doivent être inclus:
#inclure
#inclure
Instanciation d'un vecteur
int foo [10];
Ci-dessus se trouve la déclaration d'un tableau avec le nom «foo» et le nombre d'éléments «10."Ceci est un éventail d'entiers. La déclaration d'un vecteur est similaire. Pour un vecteur, le nombre d'éléments est facultatif, car la longueur du vecteur peut augmenter ou diminuer.
À ce stade du programme, la classe vectorielle a déjà été définie dans la bibliothèque, et l'en-tête a été inclus. Le vecteur peut être instancié comme suit:
STD :: Vectorvtr (8);
Ici, le vecteur est de la fonction de constructeur spécial. Le type de données que le vecteur conservera est «int», dans les supports d'angle. Le terme «VTR» est le nom choisi par le programmeur pour le vecteur. Enfin, «8», entre parenthèses, est le nombre provisoire d'entiers que le vecteur aura.
Le terme «MST» signifie espace de noms standard. Ce terme doit être suivi d'un double côlon, dans ce contexte. Tout le monde peut écrire sa propre bibliothèque de classe vectorielle et l'utiliser. Cependant, C ++ a déjà une bibliothèque standard avec des noms standard, y compris «Vector.«Pour utiliser un nom standard, le nom standard doit être précédé de Std :: . Pour éviter de taper std :: chaque fois dans le programme pour un nom standard, le fichier du programme peut démarrer comme suit:
#inclure
#inclure
Utilisation de Namespace Std;
Surchargez une fonction
Lorsque deux ou plusieurs signatures de fonction ont le même nom, ce nom est considéré comme surchargé. Lorsqu'une fonction est appelée, le nombre et le type d'arguments déterminent quelle fonction est exécutée.
Construire un vecteur
Construire un vecteur signifie instanciation (création) d'un objet vectoriel. La fonction du constructeur est surchargée comme suit:
nom vecteur
Cela crée un vecteur de longueur zéro et de type «t."L'énoncé suivant crée un vecteur de longueur zéro du type" float "avec le nom" Vtr: "
vecteurVtr;
Nom du vecteur (n)
Cela crée un vecteur avec n éléments de type «t.«Une déclaration pour ce vecteur avec quatre éléments flottants est le suivant:
vecteurvtr (4);
Nom du vecteur (n, t)
Cela crée un vecteur de n éléments initialisés à la valeur t. L'énoncé suivant crée un vecteur de 5 éléments, où chaque élément a la valeur 3.4:
vecteurVTR (5, 3.4);
Construction avec initialisation
Un vecteur peut être construit (créé) et initialisé en même temps, de l'une des deux façons suivantes:
vecteurvtr = 1.1, 2.2, 3.3, 4.4;
Ou
vecteurvtr 1.1, 2.2, 3.3, 4.4;
Notez qu'il n'y a pas de parenthèses juste après le nom de l'objet. Les parenthèses utilisées juste après que le nom de l'objet devrait avoir la liste d'initialisateur, comme suit:
vecteurvtr (1.1, 2.2, 3.3, 4.4);
Un vecteur peut être construit et initialisé plus tard avec la liste d'initialisateur. Dans ce cas, les parenthèses ne seront pas utilisées:
vecteurVtr;
vtr = 1.1, 2.2, 3.3, 4.4;
Vector V2 (V1)
Ceci est un constructeur de copie. Il crée un vecteur v2 comme copie du vecteur v1. Le code suivant illustre ceci:
vecteurvtr1 (5, 3.4);
vecteurvtr2 (vtr1);
Attribuer un vecteur pendant la construction
Pendant la construction, un vecteur vide peut être créé tandis qu'un autre lui est affecté, comme suit:
vecteurvtr1 1.1, 2.2, 3.3, 4.4;
vecteurvtr2 = vtr1;
La deuxième déclaration est équivalente à:
vecteurvtr2 = 1.1, 2.2, 3.3, 4.4;
vctor de constance
Un vecteur de const est un vecteur dont les éléments ne peuvent pas être modifiés. Les valeurs de ce vecteur sont en lecture seule. Lorsqu'il est créé, le vecteur apparaît comme suit:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
Dans ce type de vecteur, aucun élément ne peut être ajouté ou supprimé. De plus, aucune valeur ne peut être modifiée.
Construire avec itérateur
Un modèle fournit une représentation générique pour un type de données. Un itérateur fournit une représentation générique du balayage à travers les valeurs d'un conteneur. La syntaxe pour créer un vecteur avec un itérateur est la suivante:
modèle
VECTOR (Inputiterator First, Inputiterator Last, const Allocator & = allocator ());
Cela construit un vecteur pour la gamme [d'abord, dernier) en utilisant l'allocateur spécifié, qui sera discuté plus loin dans cet article.
Détruire un vecteur
Pour détruire un vecteur, permettez-le simplement de sortir de la portée et de détruire est géré automatiquement.
Capacité vectorielle
size_type Capacité () const Noexcept
Le nombre total d'éléments que le vecteur peut contenir sans nécessiter de réallocation est renvoyé par la fonction membre de la capacité. Un segment de code pour cela est le suivant:
vecteurvtr (4);
int num = vtr.capacité();
couter << num << '\n';
La sortie est 4.
réserve (n)
L'espace mémoire n'est pas toujours disponible librement. L'espace supplémentaire peut être réservé à l'avance. Considérez le segment de code suivant:
vecteurvtr (4);
vtr.réserve (6);
couter << vtr.capacity() << '\n';
La sortie est 6. Ainsi, l'espace supplémentaire réservé est de 6 à 4 = 2 éléments. La fonction renvoie vide.
size () const noexcept
Cela renvoie le nombre d'éléments dans le vecteur. Le code suivant illustre cette fonction:
vecteurvtr (4);
float sz = vtr.taille();
couter << sz << '\n';
La sortie est 4.
shrink_to_fit ()
Après avoir donné une capacité supplémentaire à un vecteur avec la fonction de réserve (), le vecteur peut être dimensionné pour s'adapter à sa taille d'origine. Le code suivant illustre ceci:
vecteurvtr (4);
vtr.réserve (6);
vtr.shrink_to_fit ();
int sz = vtr.taille();
couter << sz << '\n';
La sortie est 4 et non 6. La fonction renvoie vide.
redimensionner (sz), redimensionner (sz, c)
Cela redimensionne le vecteur. Si la nouvelle taille est plus petite que l'ancienne taille, les éléments vers la fin sont effacés. Si la nouvelle taille est plus longue, une valeur par défaut est ajoutée à la fin. Pour avoir une valeur ajoutée particulière, utilisez la fonction redimensive () avec deux arguments. Le segment de code suivant illustre l'utilisation de ces deux fonctions:
vecteurvtr1 1.1, 2.2, 3.3, 4.4;
vtr1.redimensionner (2);
couter << "New size of vtr1: " << vtr1.size() << '\n';
vecteurvtr2 1.1, 2.2;
vtr2.redimensionner (4, 8.8);
couter << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
La sortie est la suivante:
Nouvelle taille de Vtr1: 2
vtr2: 1.1 2.2 8.8 8.8
Les fonctions renvoient vide.
vide () const noexcept
Cette fonction renvoie 1 pour true s'il n'y a pas d'éléments dans le vecteur et 0 pour false si le vecteur est vide. Si un vecteur a 4 emplacements pour un type particulier de données, comme le flotteur, sans aucune valeur de flottante, alors ce vecteur n'est pas vide. Le code suivant illustre ceci:
vecteurVtr;
couter << vtr.empty() << '\n';
vecteurVT (4);
couter << vt.empty() << '\n';
vecteurV (4,3.5);
couter << v.empty() << '\n';
La sortie est la suivante:
1Accès à l'élément vecteur
Un vecteur peut être sous-scripté (indexé) comme un tableau. Le comptage d'index commence à partir de zéro.
vectorname [i]
L'opération «Vectorname [i]» renvoie une référence à l'élément au ie Index du vecteur. Le code suivant sortira 3.3 pour le vecteur ci-dessus:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
couter << fl << '\n';
vectorname [i] const
L'opération «Vectorname [i] const» est exécutée au lieu de «Vectorname [i]» lorsque le vecteur est un vecteur constant. Cette opération est utilisée dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
couter << fl << '\n';
L'expression renvoie une référence constante au ie élément du vecteur.
Attribuer une valeur avec un indice
Une valeur peut être attribuée à un vecteur non constant, comme suit:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vtr [2] = 8.8;
couter << vtr[2] << '\n';
La sortie est 8.8.
nom vectornal.à (i)
«Vectorname.à (i) "est comme" Vectorname [i] ", mais" Vectorname.à (i) ”est plus fiable. Le code suivant montre comment ce vecteur doit être utilisé:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.à 2 heures);
couter << fl << '\n';
AT () est une fonction de membre vectoriel.
nom vectornal.à (i) const
«Vectorname.à (i) const »est comme« Vectorname [i] const », mais« vectorname.à (i) const ”est plus fiable. «Vectorname.à (i) const ”est exécuté au lieu de« Vectorname.à (i) ”lorsque le vecteur est un vecteur constant. Ce vecteur est utilisé dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.à 2 heures);
couter << fl << '\n';
AT () const est une fonction de membre vectoriel.
Attribution d'une valeur avec la fonction AT ()
Une valeur peut être attribuée à un vecteur non constant avec la fonction AT (), comme suit:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vtr.à (2) = 8.8;
couter << vtr[2] << '\n';
La sortie est 8.8.
Problème avec le sous-scénario
Le problème avec le sous-scripting (indexation) est que si l'index est hors de portée, zéro peut être renvoyé ou une erreur peut être émise au moment de l'exécution.
devant()
Cela renvoie une référence au premier élément du vecteur sans retirer l'élément. La sortie du code suivant est 1.1.
vecteurvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.devant();
couter << fl << '\n';
L'élément n'est pas supprimé du vecteur.
Front () const
Lorsque la construction vectorielle est précédée par const, l'expression «front () const» est exécutée au lieu de «Front ()."Ceci est utilisé dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.devant();
couter << fl << '\n';
Une référence constante est retournée. L'élément n'est pas supprimé du vecteur.
dos()
Cela renvoie une référence au dernier élément du vecteur sans retirer l'élément. La sortie du code suivant est 4.4.
vecteurvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.dos();
couter << fl << '\n';
back () const
Lorsque la construction vectorielle est précédée par const, l'expression «back () const» est exécutée au lieu de «back ()."Ceci est utilisé dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.dos();
couter << fl << '\n';
Une référence constante est retournée. L'élément n'est pas supprimé du vecteur.
Accès aux données vectorielles
data () noexcept; data () const noExcept;
L'un ou l'autre renvoie un pointeur tel que [data (), data () + size ()) est une plage valide.
Cela sera couvert plus en détail plus loin dans l'article.
Les itérateurs de retour et le vecteur
Un itérateur est comme un pointeur mais a plus de fonctionnalité qu'un pointeur.
begin () noexcept
Renvoie un itérateur qui pointe vers le premier élément du vecteur, comme dans le segment de code suivant:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vecteur:: iterator iter = vtr.commencer();
couter << *iter << '\n';
La sortie est 1.1. Notez que la déclaration qui reçoit l'itérateur a été déclarée. L'itérateur est déréféré dans une expression de retour pour obtenir la valeur de la même manière qu'un pointeur est déréférencé.
begin () const noexcept;
Renvoie un itérateur qui pointe vers le premier élément du vecteur. Lorsque la construction vectorielle est précédée par const, l'expression «begin () const» est exécutée au lieu de «begin ().«Dans cette condition, l'élément correspondant du vecteur ne peut pas être modifié. Ceci est utilisé dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
vecteur:: const_iterator iter = vtr.commencer();
couter << *iter << '\n';
La sortie est 1.1. Notez que «const_iterator» a été utilisé cette fois au lieu de simplement «itérateur» pour recevoir l'itérateur retourné.
end () noexcept
Renvoie un itérateur qui pointe immédiatement au-delà du dernier élément du vecteur. Considérez le segment de code suivant:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vecteur:: iterator iter = vtr.fin();
couter << *iter << '\n';
La sortie est 0, ce qui n'a pas de sens, car il n'y a pas d'élément concret au-delà du dernier élément.
end () const noexcept
Renvoie un itérateur qui pointe immédiatement au-delà du dernier élément du vecteur. Lorsque la construction vectorielle est précédée par «const», l'expression «end () const» est exécutée à la place de «end ().«Considérez le segment de code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
vecteur:: const_iterator iter = vtr.fin();
couter << *iter << '\n';
La sortie est 0. Notez que «const_iterator» a été utilisé cette fois au lieu de simplement «itérateur» pour recevoir l'itérateur retourné.
Itération inversée
Il est possible d'avoir un itérateur qui itérara de la fin à juste avant le premier élément.
rbegin () noexcept
Renvoie un itérateur qui pointe vers le dernier élément du vecteur, comme dans le segment de code suivant:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vecteur:: reverse_iterator riter = vtr.rbegin ();
couter << *rIter << '\n';
La sortie est 4.4.
Notez que la déclaration qui reçoit l'itérateur inversé a été déclarée. L'itérateur est déréféré dans une expression de retour pour obtenir la valeur de la même manière qu'un pointeur est déréférencé.
rbegin () const noExcept;
Renvoie un itérateur qui pointe vers le dernier élément du vecteur. Lorsque la construction vectorielle est précédée de «const», l'expression «rbegin () const» est exécutée à la place de «rbegin ().«Dans cette condition, l'élément correspondant du vecteur ne peut pas être modifié. Cette fonctionnalité est utilisée dans le code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
vecteur:: const_reverse_iterator riter = vtr.rbegin ();
couter << *rIter << '\n';
La sortie est 4.4.
Notez que la const_reverse_iterator a été utilisée cette fois, au lieu du reverse_iterator, pour recevoir l'itérateur retourné.
Rend () Noexcept
Renvoie un itérateur qui pointe juste avant le premier élément du vecteur. Considérez le segment de code suivant:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vecteur:: reverse_iterator riter = vtr.déchirer();
couter << *rIter << '\n';
La sortie est 0, ce qui n'a pas de sens, car il n'y a pas d'élément concret juste avant le premier élément.
Rend () Const noexcept
Renvoie un itérateur qui pointe juste avant le premier élément du vecteur. Lorsque la construction vectorielle est précédée par «const», l'expression «Rend () const» est exécutée au lieu de «Rend ().«Considérez le segment de code suivant:
vctor de constancevtr 1.1, 2.2, 3.3, 4.4;
vecteur:: const_reverse_iterator riter = vtr.déchirer();
couter << *rIter << '\n';
La sortie est 0.
Notez que la const_reverse_iterator a été utilisée cette fois, au lieu du reverse_iterator, pour recevoir l'itérateur retourné.
Modificateurs vectoriels
Un modificateur qui modifie le vecteur peut prendre ou retourner un itérateur.
un.EMPLACE (P, Args)
Insère un objet de type T construit avec std :: en avant (args)… avant p.
Pour plus de détails - voir plus tard
insert (iteratorposition, valeur)
Insère une copie de la valeur à la position de l'itérateur du vecteur. Renvoie l'itérateur (position) dans le vecteur où la copie a été placée. Le code suivant montre où la valeur a été placée:
vecteurvtr 10, 20, 30, 40;
vecteur:: iterator iter = vtr.commencer();
++iter;
++iter;
vtr.insérer (iter, 25);
couter << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';
La sortie est: 20 25 30.
Notez que l'itérateur a été avancé (incrémenté) tout comme un pointeur.
Une liste d'initialisateur peut également être insérée, comme le code suivant illustre:
vecteurvtr 10, 20, 30, 40;
vecteur:: iterator iter = vtr.commencer();
++iter;
++iter;
vtr.insert (iter, 25, 28);
couter << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';
La sortie est: 20 25 28 30.
Effacer (position)
Supprime un élément à la position pointée par l'itérateur, puis renvoie la position de l'itérateur. Le code suivant illustre ceci:
vecteurvtr 10, 20, 30, 40;
vecteur:: iterator iter = vtr.commencer();
++iter;
++iter;
vtr.effacer (iter);
couter << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';
La sortie est: 10 20 40
push_back (t), push_back (RV)
Utilisé pour ajouter un seul élément à la fin du vecteur. Utilisez push_back (t) comme suit:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vtr.push_back (5.5);
float fl = vtr [4];
couter << fl << '\n';
La sortie est 5.5.
push_back (RV): - Voir plus tard.
pop_back ()
Supprime le dernier élément sans le retourner. La taille du vecteur est réduite de 1. Le code suivant illustre ceci:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vtr.pop_back ();
float sz = vtr.taille();
couter << sz << '\n';
La sortie est 3.
un.échange (b)
Deux vecteurs peuvent être échangés, comme illustré dans le segment de code suivant:
vecteurvtr1 1.1, 2.2, 3.3, 4.4;
vecteurvtr2 10, 20;
vtr1.échange (vtr2);
couter << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
couter << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
La sortie est:
vtr1: 10 20 0 0
vtr2: 1.1 2.2 3.3 4.4
Notez que la longueur d'un vecteur augmente, si nécessaire. De plus, les valeurs qui n'ont pas eu de remplacements sont remplacées par une valeur par défaut.
clair()
Supprime tous les éléments du vecteur, comme l'illustre le segment de code suivant:
vecteurvtr 1.1, 2.2, 3.3, 4.4;
vtr.clair();
couter << vtr.size() << '\n';
La sortie est 0.
Égalité et opérateurs relationnels pour les vecteurs
L'opérateur ==
Renvoie 1 pour true si les deux vecteurs ont la même taille et que les éléments correspondants sont égaux; Sinon, il renvoie 0 pour false. Par exemple:
vecteurU 1, 2, 3;
vecteurV 4, 5, 6;
bool bl = u == v;
couter << bl << '\n';
La sortie est 0.
Le != Opérateur
Renvoie 1 pour true si les deux vecteurs n'ont pas la même taille et / ou les éléments correspondants ne sont pas égaux; Sinon, il renvoie 0 pour false. Par exemple:
vecteurU 1, 2, 3;
vecteurV 4, 5, 6;
bool bl = u!= V;
couter << bl << '\n';
La sortie est 1.
Le < Operator
Renvoie 1 pour true si le premier vecteur est le sous-ensemble initial du deuxième vecteur, les éléments des deux parties égales étant identiques et dans le même ordre. Si les deux vecteurs sont de la même taille et se déplacent de gauche à droite et qu'un élément est rencontré dans le premier vecteur qui est inférieur à l'élément correspondant dans le deuxième vecteur, alors 1 sera toujours retourné. Sinon, 0 pour false est retourné. Par exemple:
vecteurU 3, 1, 1;
vecteurV 3, 2, 1;
bool bl = ucouter << bl << '\n';
La sortie est 1. < does not include the case when the size and order are the same.
L'opérateur>
Retour !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
Le <= Operator
Renvoie u <= V, where U is the first vector and V is the second vector, according to the above definitions.
L'opérateur> =
Retour !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Conclusion
Un vecteur est un exemple de conteneur de séquence. Un vecteur est une «meilleure» forme du tableau ordinaire et est instanciée d'une classe. Les vecteurs ont des méthodes classifiées sous: construction et affectation, capacité, accès aux éléments, accès aux données, itérateurs, modificateurs et opérateurs surchargés numériques.
Il existe d'autres conteneurs de séquence, appelés List, Forward_List et Array. Si la tâche implique des insertions et des suppressions fréquentes au milieu de la séquence, alors une liste ou un avantage doit être utilisé. Si la tâche implique des insertions et des suppressions fréquentes au début ou à la fin de la séquence, alors un désactivation doit être utilisé. Et donc, les vecteurs ne doivent être utilisés que lorsque ces types d'opérations ne sont pas importants.