std::string_view în C++

Vedere doar pentru citire asupra unui text existent, fără copiere; se poate micșora la capete.

Sintaxă
#include <string_view>
std::string_view v = text;
v.remove_prefix(n);
v.remove_suffix(n);

Ce face std::string_view

Un std::string_view este doar un pointer și o lungime: „privește” un text care există deja în altă parte (un std::string, un literal, un tablou char), fără să-l copieze. Este ideal ca parametru pentru funcțiile care doar citesc textul, pentru că acceptă orice fel de text fără conversii costisitoare.

Are aproape toate funcțiile de citire ale lui std::string: size, find, substr (care returnează tot o vedere, fără copiere), starts_with, contains. remove_prefix(n) și remove_suffix(n) mută capetele vederii, fără să atingă textul original.

Vederea nu deține textul: dacă textul original dispare sau se modifică, vederea devine invalidă.

Parametri

Parametru Descriere
n Pentru remove_prefix / remove_suffix: câte caractere se scot din vedere.

Exemple

Exemplul 1: Funcție care acceptă orice text

#include <iostream>
#include <string>
#include <string_view>

std::size_t numara_vocale(std::string_view text) {
    std::size_t n = 0;
    for (char c : text) {
        if (std::string_view("aeiouAEIOU").contains(c)) ++n;
    }
    return n;
}

int main() {
    std::string s = "Constantinopol";
    std::cout << numara_vocale(s) << '\n';            // din std::string
    std::cout << numara_vocale("Ana are mere") << '\n'; // din literal, fără copiere
}

Rezultat

5
6

Exemplul 2: Eliminarea spațiilor fără copiere

#include <iostream>
#include <string_view>

std::string_view trim(std::string_view v) {
    while (!v.empty() && v.front() == ' ') v.remove_prefix(1);
    while (!v.empty() && v.back() == ' ') v.remove_suffix(1);
    return v;
}

int main() {
    std::string_view rezultat = trim("   Cluj-Napoca   ");
    std::cout << "[" << rezultat << "] " << rezultat.size() << " caractere\n";
}

Rezultat

[Cluj-Napoca] 11 caractere

Exemplul 3: Bucăți dintr-un text, fără alocări

#include <iostream>
#include <string_view>

int main() {
    std::string_view cale = "/invata/cpp/string-view/";
    cale.remove_prefix(1);
    cale.remove_suffix(1);
    while (!cale.empty()) {
        std::size_t p = cale.find('/');
        std::cout << "- " << cale.substr(0, p) << '\n';
        if (p == std::string_view::npos) break;
        cale.remove_prefix(p + 1);
    }
}

Rezultat

- invata
- cpp
- string-view

Greșeli frecvente

  • Returnezi un string_view către un std::string local sau temporar: std::string_view v = std::string("abc") + "d"; arată spre memorie eliberată imediat după instrucțiune.
  • Trimiți v.data() unei funcții C care așteaptă '\0' la final: o vedere nu este neapărat terminată cu zero.
  • Apelezi remove_prefix(n) cu n mai mare decât size(): comportament nedefinit.

Comenzi înrudite

  • std::string: Șir de caractere care își gestionează singur memoria; atenție, lucrează cu octeți, nu cu litere.
  • std::string::substr: Returnează o bucată nouă din șir: n caractere începând de la poziția poz.
  • std::string::starts_with: Verifică dacă șirul începe (starts_with) sau se termină (ends_with) cu un text dat (C++20).
  • std::from_chars: Citește un număr dintr-un text, foarte rapid, fără excepții, cu raport exact despre erori.