std::string et std::vector
Ce que tu vas apprendre
- Créer, assembler et parcourir des chaînes avec
std::string. - Stocker une liste d'éléments dans un
std::vector. - Lire une ligne entière saisie par l'utilisateur.
Le texte avec std::string
Le type std::string représente une chaîne de caractères. Il se charge de la mémoire à ta place et grandit selon les besoins :
#include <iostream>
#include <string>
int main() {
std::string nom{"Tarte aux pommes"};
std::cout << nom << "\n";
std::cout << nom.size() << " caractères\n";
}
nom.size() renvoie la longueur. On appelle une méthode (une fonction attachée à un objet) avec le point.
Assembler et comparer
L'opérateur + concatène, == compare le contenu :
std::string prenom{"Tarte"};
std::string suite{" tatin"};
std::string titre = prenom + suite; // "Tarte tatin"
if (titre == "Tarte tatin") {
std::cout << "Même recette\n";
}
Quelques méthodes utiles :
| Méthode | Effet |
|---|---|
s.size() | Nombre de caractères. |
s.empty() | Vrai si la chaîne est vide. |
s.substr(0, 5) | Extrait 5 caractères depuis la position 0. |
s.find("pom") | Position de la première occurrence. |
s[0] | Premier caractère. |
Si find ne trouve rien, il renvoie la constante std::string::npos. Compare le résultat à cette constante.
Lire une phrase avec getline
std::cin >> mot s'arrête au premier espace. Pour lire toute une ligne, utilise std::getline :
std::string titre;
std::cout << "Nom de la recette : ";
std::getline(std::cin, titre);
std::cout << "Enregistré : " << titre << "\n";
cin >> juste avant un getline, le retour à la ligne resté dans le flux est lu par getline, qui renvoie une chaîne vide. Ajoute std::cin.ignore() entre les deux, ou lis tout avec getline.Une liste avec std::vector
Un std::vector est un tableau dynamique : une suite d'éléments du même type, qui peut grandir. Le type des éléments se note entre chevrons :
#include <vector>
#include <string>
std::vector<std::string> ingredients{"farine", "oeufs", "lait"};
ingredients.push_back("sucre");
push_back ajoute un élément à la fin. Le vecteur gère lui-même la mémoire nécessaire.
Lire et parcourir
On accède à un élément par son indice, qui commence à 0 :
std::cout << ingredients[0] << "\n"; // farine
std::cout << ingredients.at(1) << "\n"; // oeufs
std::cout << ingredients.size() << "\n"; // 4
La différence entre les deux : [] ne vérifie pas l'indice, alors que at lance une erreur si l'indice sort des bornes. Un indice invalide avec [] est un comportement indéfini, donc un bug dangereux.
Pour tout parcourir, le range-for du cours précédent :
for (const std::string& ingredient : ingredients) {
std::cout << "- " << ingredient << "\n";
}
Le const std::string& évite de copier chaque chaîne. On l'explique au cours 04 ; pour l'instant, recopie la forme.
Modifier un vecteur
| Opération | Effet |
|---|---|
v.push_back(x) | Ajoute x à la fin. |
v.pop_back() | Retire le dernier élément. |
v.clear() | Vide le vecteur. |
v.empty() | Vrai s'il ne contient rien. |
v.back() | Accès au dernier élément. |
Un vecteur vide se déclare simplement ainsi :
std::vector<int> notes;
notes.push_back(4);
notes.push_back(5);
std::vector. Il connaît sa taille et se copie proprement.Une fonction qui reçoit un vecteur
Les conteneurs se passent aux fonctions comme n'importe quelle valeur :
double moyenne(const std::vector<int>& notes) {
if (notes.empty()) return 0.0;
int somme = 0;
for (int n : notes) somme += n;
return static_cast<double>(somme) / notes.size();
}
Le static_cast<double> convertit la somme en réel avant la division. Sans lui, la division entière tronquerait le résultat.
À retenir
std::stringstocke du texte ;+concatène,==compare,size()donne la longueur.std::getline(std::cin, s)lit une ligne entière, espaces compris.std::vector<T>est une liste dynamique d'éléments de typeT.push_backajoute,sizecompte,atvérifie l'indice là où[]ne le fait pas.- Le range-for parcourt un vecteur ou une chaîne sans gérer d'indice.
- Préfère ces types aux tableaux et aux chaînes du langage C.
Pour aller plus loin
Sources officielles
Ensuite
Conditions, boucles et fonctions
Prendre des décisions avec if et switch, répéter avec for et while, et découper un programme en fonctions.
Références et pointeurs
Comprendre les adresses mémoire, passer des arguments sans copie avec les références et manipuler des pointeurs en sécurité.
- Projet
- Lignes de code
- Niveau
- Le quartier
- Appartement
- C++
- Pièce
- 3/7
- Plan n°
- cpp/03.string-et-vector