Zobrazenie reťazca v C++

Zobrazenie Retazca V C



V oblasti programovania v C++ je rozhodujúce uprednostňovanie efektívnosti a výkonu. Trieda „std::string_view“, predstavená v C++17, predstavuje všestrannú a pamäťovo efektívnu alternatívu k tradičnej manipulácii s reťazcami. Vo svojom jadre je „std::string_view“ nevlastnícky odkaz na postupnosť znakov, ktorá bežne predstavuje podreťazec väčšieho reťazca. Na rozdiel od „std::string“, ktorý vlastní svoje údaje a interne spravuje pamäť, „std::string_view“ funguje bez vlastníctva základných údajov. Táto vlastnosť ho robí obzvlášť cenným pre scenáre, kde je réžia kopírovania alebo správy pamäte nežiaduca. V tomto článku preskúmame rôzne príklady, aby sme pochopili využitie „std::string_view“ v C++.

Príklad 1: Efektívna manipulácia s reťazcom

V modernom vývoji C++ je efektívna manipulácia s reťazcami kľúčová pre optimalizáciu výkonu a využitia zdrojov. Umožňuje efektívny prístup a manipuláciu s reťazcami bez potreby prerozdeľovania pamäte alebo duplikácie. Na ilustráciu tohto konceptu sa ponoríme do praktického príkladu.







Zvážte nasledujúci útržok kódu:



#include
#include

void processStringView ( std::string_view strView ) {

std::cout << 'Dĺžka:' << strView.length ( ) << std::endl;
std::cout << 'Obsah: ' << strView << std::endl;
}

int main ( ) {

std::string originalString = 'Efektívna manipulácia so strunami' ;

std::string_view viewOfString ( originalString ) ;

processStringView ( viewOfString ) ;

vrátiť 0 ;
}


V tomto príklade máme funkciu „processStringView“, ktorá berie ako parameter „std::string_view“. Funkcia potom vytlačí dĺžku a obsah zobrazenia reťazca pomocou štandardného výstupu. Hlavná funkcia inicializuje „std::string“ s názvom „originalString“ s hodnotou „Efficient String Handling“. Následne sa vytvorí „std::string_view“ s názvom „viewOfString“, ktorý odkazuje na obsah „originalString“.



Odovzdaním „viewOfString“ do funkcie „processStringView“ môžeme vykonávať operácie s reťazcom efektívne, čím sa eliminuje potreba prideľovania ďalšej pamäte. „Std::string_view“ je ľahký odkaz na základnú sekvenciu znakov „originalString“ bez kopírovania údajov.





Tu je vygenerovaný výstup:



Príklad 2: Interoperabilita so starším kódom

V oblasti vývoja C++ je bezproblémová integrácia nových a starých kódových báz často kritickým problémom. „Std::string_view“ umožňuje vývojárom bez námahy interagovať so staršími funkciami, ktoré vracajú ukazovatele „const char“.

Zvážte nasledujúci príklad, ktorý demonštruje praktické použitie „std::string_view“ pre interoperabilitu. Tu máme starú funkciu s názvom „legacyFunction()“, ktorá vracia ukazovateľ „const char“:

#include
#include

const char * legacyFunction ( ) {
vrátiť 'Starý reťazec' ;
}

int main ( ) {

std::string_view legacyStrView ( legacyFunction ( ) ) ;

std::cout << 'Staré zobrazenie reťazca: ' << legacyStrView << std::endl;

vrátiť 0 ;
}


Začneme definovaním starej funkcie s názvom „legacyFunction()“, ktorá vracia ukazovateľ „const char“, ktorý predstavuje reťazec, ktorý je označený ako „Legacy String“. Na bezproblémové začlenenie týchto starších údajov do nášho moderného programu C++ používame „std::string_view“. Konkrétne vo funkcii main() vytvoríme inštanciu „std::string_view“ s názvom „legacyStrView“ a inicializujeme ju výsledkom staršej funkcie. Táto inštancia nám umožňuje efektívne zapuzdrenie a prácu so starým ukazovateľom „const char“.

Výsledkom je, že môžeme pristupovať k staršiemu reťazcu a manipulovať s ním bez zbytočného kopírovania údajov, pričom zachovávame efektivitu aj kompatibilitu. Posledný krok v kóde zahŕňa použitie „std::cout“ na vytlačenie obsahu staršieho zobrazenia reťazca.

Vykonaný výstup je:

Príklad 3: Vylepšené spracovanie reťazcových literatúr

Reťazcové literály v C++ sú tradične reprezentované ako polia znakov. „Std::string_view“ zjednodušuje prácu s reťazcovými literálmi tým, že poskytuje pohodlné rozhranie. Umožnením priameho prístupu k základnému poli znakov bez potreby explicitných konverzií „std::string_view“ zjednodušuje operácie s reťazcovými literálmi.

#include
#include

int main ( ) {
const char * myLiteral = 'Ahoj, String View!' ;
std::string_view literalView ( myLiteral ) ;

std::cout << 'Prvá postava:' << literalView [ 0 ] << std::endl;

size_t position = literalView.find ( 'reťazec' ) ;
std::cout << 'Pozícia podreťazca: ' << pozíciu << std::endl;

vrátiť 0 ;
}


V tomto príklade sa zobrazí „Ahoj, zobrazenie reťazca!“ reťazcový literál je priradený k ukazovateľu „myLiteral“. Zavedenie „std::string_view“ umožňuje efektívnejšiu reprezentáciu tohto reťazca bez potreby kopírovania jeho obsahu. Objekt „literalView“ je vytvorený pomocou ukazovateľa „myLiteral“, ktorý nám umožňuje zobraziť a manipulovať so základnou sekvenciou znakov.

Použitie „std::string_view“ poskytuje jednoduchý prístup k jednotlivým znakom v reťazci. V útržku kódu „literalView[0]“ načíta a vytlačí prvý znak reťazca, čím demonštruje jednoduchosť a priamosť prístupu k prvkom. Na určenie polohy podreťazca „String“ v rámci pôvodného reťazca sa používa metóda „nájsť“ pre „std::string_view“.

Príklad 4: Extrakcia podreťazca

Úloha extrakcie podreťazca zahŕňa získanie časti daného reťazca na základe špecifikovaných kritérií, ako je pozícia oddeľovača. Schopnosť bez námahy extrahovať podreťazce je výkonná funkcia „std::string_view“. Zvážte scenár, v ktorom potrebujeme extrahovať časť reťazca na základe oddeľovača:

#include
#include

int main ( ) {
std::string fullString = 'jablko-pomaranč-banán' ;
size_t delimiterPos = celý reťazec.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , oddeľovačPoz ) ;

std::cout << 'Extrahovaný podreťazec: ' << podreťazec << std::endl;

vrátiť 0 ;
}


V tomto úryvku kódu začíname deklaráciou pôvodného reťazca „fullString“, ktorý je inicializovaný hodnotou „apple-orange-banana“. Naším cieľom je vykonať extrakciu podreťazca. Aby sme to dosiahli, používame funkciu „nájsť“, ktorú poskytuje štandardná knižnica C++.

Keď identifikujeme pozíciu oddeľovača v rámci „fullString“, uloženej v premennej „delimiterPos“, extrahujeme požadovaný podreťazec. Funkcia „substr“ sa volá na pôvodný reťazec, pričom špecifikuje počiatočnú pozíciu (0) a dĺžku podreťazca, ktorá je presne polohou oddeľovača. Výsledkom tejto operácie je vytvorenie „std::string_view“ s názvom „subString“, ktorý predstavuje časť pôvodného reťazca od začiatku až po oddeľovač.

Príklad 5: Pamäťovo efektívne dátové štruktúry

„Std::string_view“ hrá kľúčovú úlohu pri navrhovaní pamäťovo efektívnych dátových štruktúr. Namiesto ukladania viacerých kópií reťazcov môžu dátové štruktúry ukladať inštancie „std::string_view“, čím sa znižuje réžia pamäte.

#include
#include

struct Record {
std::string_view name;
int vek;
} ;

int main ( ) {

Rekordná osoba = { 'John Doe' , 30 } ;

std::cout << 'Názov: ' << osoba.meno << ', Vek: ' << osoba.vek << std::endl;

vrátiť 0 ;
}


V tomto úryvku kódu predstavujeme využitie „std::string_view“ v rámci pamäťovo efektívnej dátovej štruktúry. Definujeme štruktúru “Record”, ktorá obsahuje člen “std::string_view” s názvom “name” a celočíselný člen s názvom “age”. Použitie „std::string_view“ v tomto kontexte nám umožňuje vytvoriť odľahčenú reprezentáciu reťazca bez potreby ďalšej alokácie pamäte.

Vo funkcii „main“ vytvoríme inštanciu objektu „Record“ s názvom „person“ s menom „John Doe“ a vekom 30 rokov. Člen „std::string_view“ „name“ slúži ako nevlastniaci pohľad na znakové údaje zodpovedajúce názvu, čím sa eliminuje potreba duplikovania obsahu reťazca. The “std::cout << “Meno: ” << meno.osoby << “, Vek: ” << osoba.vek << std::endl;” výpis vypíše meno a vek osoby, ktoré sú uložené v objekte „Záznam“.

Záver

V neustále sa vyvíjajúcom prostredí vývoja C++ vyniká „std::string_view“ ako cenný doplnok k súprave nástrojov programátora. Príklady, ktoré sú znázornené v tomto článku, zdôrazňujú prispôsobivosť a užitočnosť „std::string_view“ v oblasti programovania C++. Od efektívnej manipulácie s reťazcami a bezproblémovej interoperability so starým kódom až po pamäťovo efektívne dátové štruktúry, „std::string_view“ je cenný pre vývojárov, ktorí hľadajú vyšší výkon a optimalizovaný kód v rôznych scenároch. Tieto scenáre z reálneho sveta ukazujú, ako môže „std::string_view“ optimalizovať kód, znížiť zbytočnú réžiu pamäte a prispieť k celkovej efektívnosti aplikácií C++.