Wird geladen...

Leichte String-Verarbeitung mit std::string_view in C++

Lernen Sie std::string_view in C++, um Strings effizient und ohne unnötige Kopien zu verarbeiten.

Mit C++17 wurde std::string_view eingeführt – eine leichte, hochperformante String-Abstraktion, die es ermöglicht, mit Text zu arbeiten, ohne ihn zu kopieren. Im Vergleich zu std::string ist string_view deutlich schneller, da es keinen Speicher besitzt und nicht neu alloziert – es stellt lediglich eine Ansicht (view) auf vorhandene Daten bereit. In diesem Artikel werden die Vorteile, Anwendungsfälle und wichtigen Vorsichtsmaßnahmen von string_view erläutert.


1) Was ist string_view?

std::string_view stellt einen String oder einen Teil davon dar, ohne die Daten zu kopieren. Intern speichert es nur:

Das bedeutet: string_view besitzt die Daten nicht – es verweist nur darauf.


#include <string_view>
#include <iostream>
using namespace std;

int main() {
    string text = "Hallo Welt";

    string_view sv = text;

    cout << sv << endl;
}

2) Leistungsvorteile von string_view

std::string → kopiert Daten

Das Kopieren kann teuer sein, besonders bei großen Textmengen.

std::string_view → kopiert NICHT

Es speichert nur Zeiger + Länge. Dadurch ist es extrem schnell und ideal für Parsing, Log-Analyse, Konfigurationsdateien und viele andere textlastige Aufgaben.


3) Teilstrings mit string_view


string_view sv = "C++ Programmiersprache";

auto first = sv.substr(0, 3);   // "C++"
auto second = sv.substr(4, 14); // "Programmiersprache"

cout << first << " | " << second;

4) Whitespaces entfernen (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 = "   Hallo   ";
    string_view cleaned = trim(text);

    cout << "[" << cleaned << "]";
}

Ausgabe: [Hallo]


5) Strings mit string_view splitten


#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) Wichtige Hinweise zur Nutzung von string_view

Gefährliches Beispiel


string_view danger() {
    string temp = "Hallo"; // wird am Ende der Funktion zerstört!
    return temp;           // GEFÄHRLICH!
}

Ergebnis: undefiniertes Verhalten.

Richtiges Beispiel


string globalText = "Sicher";
string_view sv = globalText; // sicher

7) Vergleich von string_view


string_view a = "cpp";
string_view b = "cpp";

if (a == b)
    cout << "Gleich";

string_view unterstützt direkten Vergleich des Inhalts.


8) Praxisbeispiel — Kommandoanalyse


void parseCommand(string_view cmd) {
    if (cmd.starts_with("add"))
        cout << "Add-Befehl";
    else if (cmd.starts_with("delete"))
        cout << "Delete-Befehl";
}

int main() {
    parseCommand("add user");
}

9) Wann sollte man string_view verwenden?


10) TL;DR

  • string_view: leichter, nicht besitzender String-Typ.
  • Extrem schnell für Substring-Operationen.
  • Achtung: Der zugrunde liegende Text muss gültig bleiben.
  • Ideal für Parsing, Log-Analyse und Konfigurationsdateien.
  • Alle Beispiele funktionieren mit Visual Studio 2022 und GCC.

Ähnliche Artikel