Traitement léger des chaînes avec std::string_view en C++
Apprenez std::string_view en C++ pour manipuler efficacement des chaînes sans copies inutiles.
Introduit avec C++17, std::string_view est une abstraction de chaîne de caractères
légère et performante, permettant de manipuler du texte sans le copier.
Comparé à std::string, string_view est nettement plus rapide puisqu’il ne possède
pas les données : il crée simplement une vue (view) sur une zone mémoire existante.
Cet article présente les avantages de string_view, ses cas d'utilisation et les principales précautions.
1) Qu’est-ce que string_view ?
std::string_view représente une chaîne (ou une partie de celle-ci) sans effectuer de copie. En interne, il stocke simplement :
- Un pointeur vers le début du texte
- La longueur du texte
Ainsi, string_view ne possède pas les données : il ne fait que les référencer.
#include <string_view>
#include <iostream>
using namespace std;
int main() {
string text = "Bonjour le monde";
string_view sv = text;
cout << sv << endl;
}
2) Avantages de performance de string_view
std::string → copie les données
La copie est coûteuse, surtout pour les gros textes.
std::string_view → ne copie PAS
Il ne stocke qu’un pointeur et une longueur. Cela le rend extrêmement rapide et idéal pour le parsing, l’analyse de logs, la lecture de fichiers de configuration, etc.
3) Extraction de sous-chaînes avec string_view
string_view sv = "Langage de programmation C++";
auto first = sv.substr(0, 3); // "Lan"
auto second = sv.substr(8, 14); // "programmation"
cout << first << " | " << second;
4) Suppression des espaces (trim)
string_view trim(string_view sv) {
while (!sv.empty() && isspace(sv.front()))
sv.remove_prefix(1);
while (!sv.empty() && isspace(sv.back()))
sv.remove_suffix(1);
return sv;
}
int main() {
string_view text = " Bonjour ";
string_view cleaned = trim(text);
cout << "[" << cleaned << "]";
}
Sortie : [Bonjour]
5) Découpage d’une chaîne (split) avec string_view
#include <vector>
vector<string_view> split(string_view sv, char delimiter) {
vector<string_view> parts;
size_t start = 0;
while (true) {
size_t pos = sv.find(delimiter, start);
if (pos == string_view::npos) {
parts.push_back(sv.substr(start));
break;
}
parts.push_back(sv.substr(start, pos - start));
start = pos + 1;
}
return parts;
}
int main() {
string_view text = "cpp,java,python";
auto parts = split(text, ',');
for (auto p : parts)
cout << p << endl;
}
6) Attention : pièges à éviter avec string_view
- Attention : string_view ne possède pas les données.
- Donc : si les données référencées disparaissent, string_view devient invalide.
Exemple dangereux
string_view danger() {
string temp = "Bonjour"; // détruit en fin de fonction !
return temp; // DANGEREUX !
}
Résultat : comportement indéfini.
Exemple correct
string globalText = "Sûr";
string_view sv = globalText; // sûr
7) Comparaison de string_view
string_view a = "cpp";
string_view b = "cpp";
if (a == b)
cout << "Égal";
string_view permet de comparer directement le contenu.
8) Exemple pratique — Analyse d’un ordre (command parsing)
void parseCommand(string_view cmd) {
if (cmd.starts_with("add"))
cout << "Commande d’ajout";
else if (cmd.starts_with("delete"))
cout << "Commande de suppression";
}
int main() {
parseCommand("add user");
}
9) Quand utiliser string_view ?
- Pour manipuler de grands volumes de texte
- Pour extraire rapidement des sous-chaînes
- Pour éviter des allocations mémoire inutiles
- Pour du parsing critique en performance
10) TL;DR
- string_view : type de chaîne léger et non-possédé.
- Très rapide pour les opérations de sous-chaînes.
- Nécessite que les données sous-jacentes restent valides.
- Idéal pour le parsing, les logs et la lecture de configurations.
- Exemples compatibles avec Visual Studio 2022 et GCC.
Articles connexes
Aperçu de la bibliothèque standard C++
Découvrez la bibliothèque standard C++, les conteneurs STL, les algorithmes et les composants essentiels du développement moderne.
Introduction aux fonctions en C++ : définition, appel, paramètres
Apprenez les fonctions en C++ : définition, appel et paramètres pour créer des programmes modulaires.
Manipulation de chaînes en C++ : C-Style et std::string
Apprenez la manipulation de chaînes en C++ avec les chaînes C-Style et std::string à travers des exemples pratiques.