Chargement...

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 :

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

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 ?


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