Le quartierC++ C++Pièce 3/7Débutant

std::string et std::vector

Manipuler du texte avec std::string et des listes d'éléments avec std::vector, les deux outils de base de la bibliothèque standard.

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éthodeEffet
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";
Si tu lis un nombre avec 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érationEffet
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);
Quand tu hésites entre un tableau classique et un conteneur, choisis 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::string stocke 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 type T.
  • push_back ajoute, size compte, at vé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

Projet
Lignes de code
Niveau
Le quartier
Appartement
C++
Pièce
3/7
Plan n°
cpp/03.string-et-vector
Lignes de code · fiches rédigées à partir des documentations officielles, sources citées en bas de chaque page.