Il y a beaucoup plus d'éléments dans la bibliothèque standard C ++ que nous avons le temps de couvrir. Nous nous limiterons à examiner certaines des fonctionnalités les plus couramment utilisées que nous n'avons pas encore explorées..
Les itérateurs servent les mêmes objectifs que IEnumerable
et des interfaces associées dans .NET, telles que fournir un moyen commun de naviguer dans les collections. Donné un std :: vector
, Par exemple, vous pouvez parcourir sa collection d'éléments à l'aide du code suivant:
vecteurvec; vec.push_back (1); vec.push_back (4); vec.push_back (7); vec.push_back (12); vec.push_back (8); pour (auto i = début (vec); i! = fin (vec); i ++) wcout << *i << endl;
le std :: begin
fonction fournit un itérateur pointant vers le premier élément de la collection. std :: end
fournit un itérateur qui signale que nous avons atteint la fin d'une collection; le dernier article de la collection, en supposant que la collection ait des articles, est un article avant l'article qui nous est donné par std :: end
. C'est pourquoi nous vérifions! = Dans la boucle for. Si aucun élément ne figure dans la collection, alors std :: begin
et std :: end
retournera la même valeur.
En plus des itérateurs de ces deux fonctions de modèle, de nombreuses collections fournissent des itérateurs constants via des fonctions membres nommées cbegin et cend, des itérateurs inversés (qui parcourent une collection à l'envers) via commencer
et déchirer
, et const inverseurs via crbegin
et se pencher
. Dans l'exemple précédent, vous pouvez remplacer commencer (vec)
avec vec.rbegin ()
et fin (vec)
avec vec.rend ()
passer par le vecteur en sens inverse.
C ++ 11 a ajouté un type supplémentaire de boucle for, appelé boucle for basée sur la plage, qui fournit des fonctionnalités similaires à la boucle foreach en C #. La boucle for basée sur la plage utilise des itérateurs et vous évite les problèmes de dé-référencement des pointeurs et la possibilité d'une vérification incorrecte de la fin. La boucle for équivalente à la boucle for de l'exemple précédent ressemble à ceci:
pour (article auto: vec) wcout << item << endl;
std :: vector
et autres conteneursLa collection que vous utiliserez probablement le plus est std :: vector
. C’est une collection rapide et polyvalente semblable à List
Pour ajouter un élément à la fin d'un vecteur, utilisez la fonction member repousser
. Pour supprimer un élément de la fin d’un vecteur, utilisez pop_back
. Vous pouvez accéder aux éléments à leur index en utilisant [] de la même manière que vous le feriez pour un tableau. Pour ajouter un élément ou une plage d'éléments à un index de base zéro spécifique, utilisez la fonction insert member. Pour supprimer un élément ou une plage d'éléments à un index de base zéro spécifique, utilisez la fonction effacer le membre.
Une fonctionnalité intéressante ajoutée à C ++ 11 est la fonctionnalité de construction sur place fournie par les fonctions membres emplace et emplace_back. Plutôt que de construire un objet et d'utiliser ensuite insert ou push_back pour l'ajouter au vecteur, vous pouvez appeler emplace_back et lui transmettre simplement les mêmes arguments que vous transmettriez au constructeur pour le type que le vecteur contient. Le vecteur construira ensuite et ajoutera une nouvelle instance de l'objet sans les calculs supplémentaires fournis avec une copie ou un déplacement, et sans utiliser de mémoire supplémentaire..
le emplace
function fonctionne de la même manière, sauf que vous commencez par lui transmettre un itérateur qui spécifie l'emplacement. Vous pouvez utiliser cbegin ()
ou cend ()
ajouter des éléments au début ou à la fin du vecteur. Si vous souhaitez placer un élément sur un index de base zéro spécifique, vous pouvez utiliser vec.cbegin () + idx
. Vous pouvez également soustraire de cend ()
si vous voulez placer un objet un certain nombre d'espaces à partir de la fin.
vector offre plus de fonctionnalités, vous devez donc l'explorer davantage. La fonction at member vous donnera un élément à un index, par exemple. Il existe des moyens de demander au vecteur de redimensionner sa capacité interne afin de libérer de l'espace - si vous saviez qu'il vous faudrait exactement 125 éléments, par exemple, vous réduisez au minimum l'utilisation de la mémoire - si vous ajoutez tous les éléments dont il aura besoin et les contraintes de mémoire sont serrées.
En plus de std :: vector
, plusieurs conteneurs similaires ont des cas d'utilisation différents. std :: vector
lui-même est le meilleur choix lorsque vous avez besoin d'un accès extrêmement rapide et aléatoire, lorsque vous allez principalement ajouter et supprimer des éléments à la toute fin de la collection. Si vous devez également ajouter fréquemment des éléments au début de la collection, envisagez d'utiliser std :: deque
au lieu.
Utilisation std :: queue
pour un conteneur premier entré, premier sorti. Utilisez std :: stack pour un conteneur dernier entré, premier sorti.
le std :: carte
la classe fournit un dictionnaire trié. std :: unordered_map
fournit une table de hachage.
le std :: set
class est une collection triée et à clé où l'élément stocké est sa propre clé. Chaque élément doit donc être unique.. std :: unordered_set
est l'équivalent non trié de std :: set
.
le std :: list
la classe fournit une liste doublement chaînée. std :: forward_list
fournit une liste liée individuellement.
Entêtele
Certaines fonctionnalités de la bibliothèque d'exécution C peuvent être utiles. En règle générale, le meilleur moyen d’accéder à la bibliothèque est d’inclure les informations pertinentes.
La bibliothèque standard C ++ a beaucoup plus à offrir, je vous recommande donc vivement de l'explorer et de vous familiariser avec elle. Dans le dernier article de cette série, nous explorons Visual Studio et sa meilleure utilisation pour le développement C ++..
Cette leçon représente un chapitre de C ++ Succinctly, un eBook gratuit de l’équipe de Syncfusion..