Vedere șiruri în C++

Vedere Siruri In C



În domeniul programării C++, prioritizarea eficienței și performanței este crucială. Clasa „std::string_view”, introdusă în C++17, prezintă o alternativă versatilă și eficientă din punct de vedere al memoriei la manipularea tradițională a șirurilor. În esență, „std::string_view” este o referință neproprietă la o secvență de caractere, reprezentând de obicei un subșir al unui șir mai mare. Spre deosebire de „std::string” care deține datele și gestionează memoria intern, „std::string_view” funcționează fără a deține datele de bază. Această caracteristică îl face deosebit de valoros pentru scenariile în care suprasolicitarea copierii sau gestionării memoriei este nedorită. În acest articol, vom explora diferitele exemple pentru a înțelege utilizarea „std::string_view” în C++.

Exemplul 1: Manipulare eficientă a șirurilor

În dezvoltarea modernă C++, gestionarea eficientă a șirurilor este crucială pentru optimizarea performanței și a utilizării resurselor. Permite accesul și manipularea eficientă a șirurilor de caractere fără a fi nevoie de realocarea sau duplicarea memoriei. Pentru a ilustra acest concept, să pătrundem într-un exemplu practic.







Luați în considerare următorul fragment de cod:



#include
#include

void processStringView ( std::string_view strView ) {

std::cout << 'Lungime:' << strView.lungime ( ) << std::endl;
std::cout << „Conținut:” << strView << std::endl;
}

int principal ( ) {

std::string originalString = „Manipulare eficientă a șirurilor” ;

std::string_view viewOfString ( originalString ) ;

processStringView ( viewOfString ) ;

întoarcere 0 ;
}


În acest exemplu, avem funcția „processStringView” care ia „std::string_view” ca parametru. Apoi, funcția tipărește lungimea și conținutul vizualizării șirului folosind rezultatul standard. Funcția principală inițializează „std::string” numit „originalString” cu valoarea „Efficient String Handling”. Ulterior, „std::string_view” denumit „viewOfString” este creat, referindu-se la conținutul „originalString”.



Trecând funcția „viewOfString” la funcția „processStringView”, putem efectua operațiunile pe șir eficient, eliminând necesitatea alocărilor suplimentare de memorie. „std::string_view” este o referință ușoară la secvența de caractere de bază a „originalString” fără a copia datele.





Iată rezultatul generat:



Exemplul 2: Interoperabilitate cu codul vechi

În domeniul dezvoltării C++, integrarea perfectă a bazelor de cod noi și vechi este adesea o preocupare critică. „std::string_view” permite dezvoltatorilor să interacționeze fără efort cu funcțiile vechi care returnează indicatorii „const char”.

Luați în considerare următorul exemplu care demonstrează utilizarea practică a „std::string_view” pentru interoperabilitate. Aici, avem o funcție moștenită numită „legacyFunction()” care returnează un pointer „const char”:

#include
#include

const char * legacyFunction ( ) {
întoarcere „Șir de moștenire” ;
}

int principal ( ) {

std::string_view legacyStrView ( legacyFunction ( ) ) ;

std::cout << „Vizualizare șiruri moștenite:” << legacyStrView << std::endl;

întoarcere 0 ;
}


Începem prin a defini o funcție moștenită numită „legacyFunction()” care returnează un pointer „const char” care reprezintă un șir etichetat ca „Legacy String”. Pentru a încorpora fără probleme aceste date moștenite în programul nostru modern C++, folosim „std::string_view”. În funcția main(), în special, creăm o instanță de „std::string_view” numită „legacyStrView” și o inițializam cu rezultatul funcției moștenite. Această instanțiere ne permite să încapsulăm și să lucrăm eficient cu indicatorul „const char” moștenit.

Drept urmare, putem accesa și manipula șirul moștenit fără a recurge la copierea inutilă a datelor, păstrând atât eficiența, cât și compatibilitatea. Pasul final al codului implică utilizarea „std::cout” pentru a imprima conținutul vizualizării șirurilor moștenite.

Ieșirea executată este:

Exemplul 3: Gestionare îmbunătățită a literalelor șirurilor

Literale șiruri în C++ sunt reprezentate în mod tradițional ca șiruri de caractere. „std::string_view” simplifică lucrul cu literalele șir, oferind o interfață convenabilă. Permițând un acces direct la matricea de caractere de bază fără a fi nevoie de conversii explicite, „std::string_view” eficientizează operațiunile asupra literalelor șir.

#include
#include

int principal ( ) {
const char * myLiteral = „Bună ziua, String View!” ;
std::string_view literalView ( myLiteral ) ;

std::cout << 'Primul caracter:' << literalView [ 0 ] << std::endl;

size_t position = literalView.find ( 'Şir' ) ;
std::cout << 'Poziția subșirului: ' << poziţie << std::endl;

întoarcere 0 ;
}


În acest exemplu, un „Bună ziua, vizualizare șir!” literal șir este atribuit indicatorului „myLiteral”. Introducerea „std::string_view” facilitează o reprezentare mai eficientă a acestui șir fără a fi nevoie să copiați conținutul acestuia. Obiectul „literalView” este creat folosind indicatorul „myLiteral” care ne permite să vedem și să manipulăm secvența de caractere de bază.

Utilizarea „std::string_view” oferă un acces ușor la caracterele individuale din șir. În fragmentul de cod, „literalView[0]” preia și tipărește primul caracter al șirului, arătând simplitatea și directitatea accesării elementelor. Metoda „find” a „std::string_view” este folosită pentru a determina poziția subșirului „String” în șirul original.

Exemplul 4: Extragerea subșirurilor

Sarcina de extragere a subșirurilor implică preluarea unei porțiuni dintr-un șir dat pe baza unor criterii specificate, cum ar fi poziția unui delimitator. Abilitatea de a extrage fără efort subșirurile este o caracteristică puternică a „std::string_view”. Luați în considerare un scenariu în care trebuie să extragem o porțiune dintr-un șir pe baza unui delimitator:

#include
#include

int principal ( ) {
std::string fullString = 'mar-portocale-banana' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , delimitatorPos ) ;

std::cout << 'Subșir extras: ' << subString << std::endl;

întoarcere 0 ;
}


În acest fragment de cod, începem cu declararea unui șir original, „fullString”, care este inițializat cu valoarea „apple-orange-banana”. Scopul nostru este să efectuăm extracția subșirurilor. Pentru a realiza acest lucru, folosim funcția „găsește” oferită de biblioteca standard C++.

Odată ce identificăm poziția delimitatorului în cadrul „fullString”, stocat în variabila „delimiterPos”, extragem subșirul dorit. Funcția „substr” este apelată pe șirul original, specificând poziția de pornire (0) și lungimea subșirului care este exact poziția delimitatorului. Această operație are ca rezultat crearea „std::string_view” denumit „subString” care reprezintă porțiunea șirului original de la început până la delimitator.

Exemplul 5: Structuri de date eficiente din punct de vedere al memoriei

„std::string_view” joacă un rol crucial în proiectarea structurilor de date eficiente din punct de vedere al memoriei. În loc să stocheze mai multe copii ale șirurilor de caractere, structurile de date pot stoca instanțele „std::string_view”, reducând astfel supraîncărcarea memoriei.

#include
#include

struct Record {
std::string_view nume;
int vârsta;
} ;

int principal ( ) {

Persoana record = { „John Doe” , 30 } ;

std::cout << 'Nume: ' << persoana.nume << ', Varsta: ' << personaj << std::endl;

întoarcere 0 ;
}


În acest fragment de cod, prezentăm utilizarea „std::string_view” într-o structură de date eficientă din punct de vedere al memoriei. Definim o structură „Înregistrare” care cuprinde un membru „std::string_view” numit „nume” și un membru întreg numit „vârstă”. Utilizarea „std::string_view” în acest context ne permite să creăm o reprezentare ușoară a unui șir fără a fi nevoie de alocarea suplimentară de memorie.

În funcția „principală”, instanțiăm un obiect „Înregistrare” numit „persoană” cu numele „John Doe” și vârsta de 30 de ani. „Numele” membru „std::string_view” servește ca o vedere neproprietă a datele de caractere corespunzătoare numelui, eliminând necesitatea duplicării conținutului șirului. „std::cout << „Nume: ” << person.name << “, Age: ” << person.age << std::endl;” instrucțiunea scoate numele și vârsta persoanei care sunt stocate în obiectul „Înregistrare”.

Concluzie

În peisajul în continuă evoluție al dezvoltării C++, „std::string_view” iese în evidență ca un plus valoros la setul de instrumente al programatorului. Instanțele care sunt ilustrate în acest articol evidențiază adaptabilitatea și utilitatea „std::string_view” în domeniul programării C++. De la manipularea eficientă a șirurilor și interoperabilitatea perfectă cu codul moștenit până la structuri de date eficiente din punct de vedere al memoriei, „std::string_view” este valoros pentru dezvoltatorii care caută performanțe îmbunătățite și cod optimizat în diverse scenarii. Aceste scenarii din lumea reală demonstrează modul în care „std::string_view” poate optimiza codul, poate reduce supraîncărcarea de memorie inutilă și poate contribui la eficiența generală a aplicațiilor C++.