C ++ Vector of Pointers Exemples

C ++ Vector of Pointers Exemples
Un vecteur ordinaire rencontré dans la programmation C ++, est un vecteur d'objets du même type. Ces objets peuvent être des objets ou des objets fondamentaux instanciés à partir d'une classe. Cet article illustre des exemples de vecteur de pointeurs, au même type d'objet. Pour utiliser un vecteur C ++, le programme doit inclure la bibliothèque vectorielle, avec une directive.

Tout le code vectoriel de cet article est dans la fonction principale (), sauf indication contraire. Le vecteur de pointeurs vers différents types est cependant abordé à la fin de l'article. Afin d'apprécier le vecteur de pointes, il est bon de se rappeler les connaissances pour le vecteur d'objets.

Contenu de l'article

  • Rappel pour le vecteur d'objets
  • Vecteur de pointeurs du même type
  • Vecteur de pointeurs vers différents types
  • Conclusion

Rappel pour le vecteur d'objets

Vector of Character Exemple
Le programme suivant montre un exemple de vecteur de Chars:

#inclure
#inclure
Utilisation de Namespace Std;
int main()

vector vtr = 'u', 'v', 'w', 'x', 'y', 'z';
pour (int i = 0; icouter << vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << *it << ";
couter << endl;
retour 0;

La sortie est:

U V w x y z
U V w x y z

La même liste a été affichée deux fois. La première déclaration de la fonction principale () crée un vecteur de chars. Les deux segments de code suivants, impriment la même liste de vecteurs au terminal. Le premier de ces segments de code, utilise des index. Le second utilise des itérateurs.

Vector of Integer Exemple
Le programme suivant, montre un exemple de vecteur d'INTS:

#inclure
#inclure
Utilisation de Namespace Std;
int main()

vecteur vtr = 1, 2, 3, 4, 5, 6;
pour (int i = 0; icouter << vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << *it << ";
couter << endl;
retour 0;

La sortie est:

1 2 3 4 5 6
1 2 3 4 5 6

La même liste a été affichée deux fois, de la même manière que dans le code précédent.

Vector of String Object Exemple
Un pointeur de const vers Chars, pointe vers un littéral de cordes. Un objet String est instancié à partir de la classe String. Pour avoir un objet String, la bibliothèque String doit être incluse avec une directive, en haut du programme. Il est possible et facile d'avoir un vecteur d'objets String, comme le montre le programme suivant:

#inclure
#inclure
#inclure
Utilisation de Namespace Std;
int main()

vector vtr = "one", "deux", "trois", "quatre", "cinq";
pour (int i = 0; icouter << vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << *it << ";
couter << endl;
retour 0;

La sortie est:

un deux trois quatre cinq
un deux trois quatre cinq

La même liste a été affichée deux fois, de la même manière que dans le code précédent.

Vector d'un exemple d'objet instancié
Le programmeur peut créer sa propre classe, instancier des objets de la classe, puis mettre les objets dans un vecteur. Le programme suivant illustre ceci:

#inclure
#inclure
Utilisation de Namespace Std;
classe thecla
public:
const char * str;
Thecla (char chs [])
str = chs;

;
int main()

char ch1 [] = "text1", ch2 [] = "text2", ch3 [] = "text3", ch4 [] = "text4", ch5 [] = "text5";
Thecla obj1 (ch1), obj2 (ch2), obj3 (ch3), obj4 (ch4), obj5 (ch5);
vector vtr = obj1, obj2, obj3, obj4, obj5;
pour (int i = 0; icouter << vtr[i].str << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter couter << endl;
retour 0;

La sortie est:

text1 text2 text3 text4 text5
text1 text2 text3 text4 text5

La même liste a été affichée deux fois, de la même manière que dans le code précédent.

La classe a un constructeur et un membre des données publiques. Le constructeur attribue son argument à ce membre de données.

Les valeurs du vecteur, cette fois, sont des littéraux de cordes et non des objets de chaîne. Donc, notez la façon dont les littéraux et les éléments vectoriels ont été codés.

Si un objet instancié de la classe est obj, alors la valeur du membre, STR serait accessible par l'objet, comme:

obj.Str

OBJ dans ce cas est une référence. Notez l'utilisation de l'opérateur de points. C'est pourquoi, dans le segment de code dernier mais un, dans la fonction principale (), chaque valeur vectorielle a été accessible en tant que:

vtr [i].Str

où [i] est l'index.

Si un pointeur vers OBJ est «IT», alors la valeur du membre, STR serait accessible par l'objet, comme:

it-> str

Notez l'utilisation de l'opérateur de flèches ici. L'itérateur est comme un pointeur. C'est pourquoi, dans le dernier segment de code, chaque valeur vectorielle a été accessible en tant que:

it-> str

où «it» est l'itérateur.

Vecteur de pointeurs du même type

Exemple de vecteur de pointeurs vers les personnages
Le programme suivant montre un exemple de vecteur de pointeurs vers Chars:

#inclure
#inclure
Utilisation de Namespace Std;
int main()

char ch1 = 'u', ch2 = 'v', ch3 = 'w', ch4 = 'x', ch5 = 'y', ch6 = 'z';
vector vtr = & ch1, & ch2, & ch3, & ch4, & ch5, & ch6;
pour (int i = 0; icouter << *vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << **it << ";
couter << endl;
retour 0;

La sortie est:

U V w x y z
U V w x y z

La même liste a été affichée deux fois. La première instruction de la fonction principale () crée 6 caractères avec leurs identifiants. La deuxième instruction représente ces caractères, avec leurs adresses en mémoire; Et cela se traduit par un vecteur de pointeurs vers Chars. Notez l'argument du modèle de ce vecteur. Les deux segments de code suivants, impriment la même liste de vecteurs au terminal. Le premier de ces segments de code utilise des index. Le second utilise des itérateurs.

Pour le premier de ces segments de code, puisque chaque élément du vecteur est un pointeur, la référence d'index doit être déréférencée par l'opérateur d'indirection * *.

L'itérateur est comme un pointeur. Pour la seconde de ces segments de code, puisque chaque élément du vecteur est un pointeur, et l'itérateur est comme un pointeur, chaque élément est considéré comme un pointeur pour pointer. Et donc chaque élément doit être déréférencé deux fois, avec **.

Exemple de vecteur de pointeurs vers les entiers
Le programme suivant, qui est similaire à ce qui précède, montre un exemple de vecteur de pointeurs vers INTS:

#inclure
#inclure
Utilisation de Namespace Std;
int main()

int int1 = 1000, int2 = 2000, int3 = 3000, int4 = 4000, int5 = 5000, int6 = 6000;
vector vtr = & int1, & int2, & int3, & int4, & int5, & int6;
pour (int i = 0; icouter << *vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << **it << ";
couter << endl;
retour 0;

La sortie est:

1000 2000 3000 4000 5000 6000
1000 2000 3000 4000 5000 6000

La même liste a été affichée deux fois, de la même manière, comme du code précédent.

Exemple de vecteur de pointeurs vers des objets à chaîne
Un pointeur de const vers Chars, pointe vers un littéral de cordes. Un objet String est instancié à partir de la classe String. Pour avoir un objet String, la bibliothèque String doit être incluse avec une directive, en haut du programme. Il est possible et facile d'avoir un vecteur de pointeurs vers des objets à chaîne, comme le montre le programme suivant:

#inclure
#inclure
#inclure
Utilisation de Namespace Std;
int main()

String str1 = "aaa", str2 = "bbb", str3 = "ccc", str4 = "ddd", str5 = "eee", str6 = "fff";
vector vtr = & str1, & str2, & str3, & str4, & str5, & str6;
pour (int i = 0; icouter << *vtr[i] << ";
couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter << **it << ";
couter << endl;
retour 0;

La sortie est:

aaa bbb ccc ddd eee fff
aaa bbb ccc ddd eee fff

La même liste a été affichée deux fois, de la même manière, comme du code précédent.

Vecteur de pointeurs vers les objets de classe définis par l'utilisateur

Le programmeur peut créer sa propre classe, instancier des objets de la classe, puis mettre des pointeurs sur les objets, dans un vecteur. Le programme suivant illustre ceci:

#inclure
#inclure
Utilisation de Namespace Std;
classe thecla
public:
const char * str;
Thecla (char chs [])
str = chs;

;
int main()

char ch1 [] = "text1", ch2 [] = "text2", ch3 [] = "text3", ch4 [] = "text4", ch5 [] = "text5";
Thecla obj1 (ch1), obj2 (ch2), obj3 (ch3), obj4 (ch4), obj5 (ch5);
vector vtr = & obj1, & obj2, & obj3, & obj4, & obj5;
pour (int i = 0; icouter couter << endl;
pour (vector :: iterator it = vtr.commencer(); il != VTR.fin(); it ++)
couter couter << endl;
retour 0;

La sortie est:

text1 text2 text3 text4 text5
text1 text2 text3 text4 text5

La même liste a été affichée deux fois, de la même manière que dans le code précédent.

La classe a un constructeur et un membre des données publiques. Le constructeur attribue son argument à ce membre de données.

Les valeurs du vecteur, cette fois, sont des littéraux de cordes et non des objets de chaîne. Donc, notez la façon dont les littéraux et les éléments vectoriels ont été codés.

Si un objet instancié de la classe est obj, alors la valeur du membre, STR serait accessible par l'objet, comme:

obj.Str

OBJ dans ce cas est une référence. Si un pointeur vers OBJ est PTR, alors la valeur du membre, STR serait accessible via le pointeur, comme:

ptr-> str

C'est pourquoi dans le segment de code dernier mais un, chaque valeur vectorielle a été accessible:

vtr [i] -> str

Si Ptrptr est un pointeur vers PTR (pointeur vers pointeur), la valeur du membre, STR serait accessible via le pointeur, comme:

(* ptrptr) -> str

Les parenthèses garantissent que (* ptrptr) est évaluée en premier, au lieu de la première évaluation possible de (ptrptr-> str).

L'itérateur est comme un pointeur. C'est pourquoi dans le dernier segment de code, chaque valeur vectorielle a été consultée comme suit:

(* it) -> str

où «it» est l'itérateur.

Vecteur de pointeurs vers différents types

Pour avoir un vecteur de pointeurs vers différents types, utilisez la procédure suivante:

  • Laissez le modèle du vecteur, pointeur vers le vide.
  • Soit les valeurs des vecteurs, les adresses des différents objets de différents types.
  • Lorsque vous lisez les valeurs, jetez les pointeurs vides vers leurs types appropriés.

Le programme suivant les illustre, avec des objets char, int et string:

#inclure
#inclure
#inclure
Utilisation de Namespace Std;
int main()

char ch = 'u';
int Inte = 1000;
String str = "Je t'aime."
vector vtr = & ch, & Inte, & str;
couter << *((char*)vtr[0]) << endl;
couter << *((int*)vtr[1]) << endl;
couter << *((string*)vtr[2]) << endl;
retour 0;

La sortie est:

U
1000
Je t'aime.

Conclusion

Un vecteur de pointeurs est similaire à un vecteur d'objets. Les principales différences sont les suivantes: les valeurs du vecteur des pointeurs doivent être des adresses d'objets déclarés ou instanciés de la classe. Supposons que le nom de classe est TheCla, alors l'argument du modèle du vecteur doit être «thecla *». L'adresse d'un objet est obtenue en précédant l'identifiant de l'objet, avec & .