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_viewcătre unstd::stringlocal 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)cunmai mare decâtsize(): 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.