Strängvy i C++

Strangvy I C



Inom området C++-programmering är prioritering av effektivitet och prestanda avgörande. Klassen 'std::string_view', introducerad i C++17, presenterar ett mångsidigt och minneseffektivt alternativ till traditionell strängmanipulation. I kärnan är 'std::string_view' en icke-ägande referens till en sekvens av tecken, som vanligtvis representerar en delsträng av en större sträng. Till skillnad från 'std::string' som äger sina data och hanterar minnet internt, fungerar 'std::string_view' utan att äga den underliggande datan. Denna egenskap gör den särskilt värdefull för scenarier där kostnaden för kopiering eller hantering av minnet är oönskad. I den här artikeln kommer vi att utforska de olika exemplen för att förstå användningen av 'std::string_view' i C++.

Exempel 1: Effektiv stränghantering

I modern C++-utveckling är effektiv stränghantering avgörande för att optimera prestanda och resursutnyttjande. Det möjliggör effektiv åtkomst och manipulering av strängar utan att behöva omfördela minnet eller duplicera. För att illustrera detta koncept, låt oss gå in på ett praktiskt exempel.







Tänk på följande kodavsnitt:



#include
#inkludera

ogiltig processStringView ( std::string_view strView ) {

std::cout << 'Längd:' << strView.length ( ) << std::endl;
std::cout << 'Innehåll: ' << strView << std::endl;
}

int main ( ) {

std::string originalString = 'Effektiv stränghantering' ;

std::string_view viewOfString ( originalString ) ;

processStringView ( viewOfString ) ;

lämna tillbaka 0 ;
}


I det här exemplet har vi funktionen 'processStringView' som tar 'std::string_view' som parameter. Funktionen skriver sedan ut längden och innehållet i strängvyn med standardutdata. Huvudfunktionen initierar 'std::string' med namnet 'originalString' med värdet 'Efficient String Handling'. Därefter skapas 'std::string_view' med namnet 'viewOfString', med hänvisning till innehållet i 'originalString'.



Genom att skicka 'viewOfString' till 'processStringView'-funktionen kan vi utföra operationerna på strängen effektivt, vilket eliminerar behovet av extra minnesallokeringar. 'std::string_view' är en lätt referens till den underliggande teckensekvensen för 'originalString' utan att kopiera data.





Här är den genererade utgången:



Exempel 2: Interoperabilitet med äldre kod

När det gäller C++-utveckling är den sömlösa integrationen av nya och gamla kodbaser ofta ett kritiskt problem. 'std::string_view' låter utvecklarna interagera utan ansträngning med äldre funktioner som returnerar 'const char'-pekarna.

Betrakta följande exempel som visar den praktiska användningen av 'std::string_view' för interoperabilitet. Här har vi en äldre funktion som heter 'legacyFunction()' som returnerar en 'const char'-pekare:

#include
#inkludera

konst röding * legacyFunction ( ) {
lämna tillbaka 'Äldre sträng' ;
}

int main ( ) {

std::string_view legacyStrView ( legacyFunction ( ) ) ;

std::cout << 'Äldre strängvy: ' << legacyStrView << std::endl;

lämna tillbaka 0 ;
}


Vi börjar med att definiera en äldre funktion som heter 'legacyFunction()' som returnerar en 'const char'-pekare som representerar en sträng som är märkt som 'Legacy String'. För att sömlöst införliva denna äldre data i vårt moderna C++-program använder vi 'std::string_view'. Specifikt i main()-funktionen skapar vi en instans av 'std::string_view' med namnet 'legacyStrView' och initierar den med resultatet av den äldre funktionen. Denna instansiering tillåter oss att effektivt kapsla in och arbeta med den äldre 'const char'-pekaren.

Som ett resultat kan vi komma åt och manipulera den äldre strängen utan att tillgripa onödig datakopiering, vilket bevarar både effektivitet och kompatibilitet. Det sista steget i koden innebär att man använder 'std::cout' för att skriva ut innehållet i den äldre strängvyn.

Den exekverade utgången är:

Exempel 3: Förbättrad hantering av strängbokstavar

Strängliteraler i C++ representeras traditionellt som arrayer av tecken. 'std::string_view' förenklar arbetet med strängliteraler genom att tillhandahålla ett bekvämt gränssnitt. Genom att tillåta direkt åtkomst till den underliggande teckenuppsättningen utan behov av explicita omvandlingar, effektiviserar 'std::string_view' operationerna på strängliteraler.

#include
#inkludera

int main ( ) {
konst röding * myLiteral = 'Hej, String View!' ;
std::string_view literalView ( myLiteral ) ;

std::cout << 'Första karaktären:' << literalView [ 0 ] << std::endl;

size_t position = literalView.find ( 'Sträng' ) ;
std::cout << 'Substring position:' << placera << std::endl;

lämna tillbaka 0 ;
}


I det här exemplet visas en 'Hej, strängvy!' string literal tilldelas 'myLiteral'-pekaren. Introduktionen av 'std::string_view' underlättar en mer effektiv representation av denna sträng utan att behöva kopiera dess innehåll. Objektet 'literalView' skapas med hjälp av 'myLiteral'-pekaren som låter oss se och manipulera den underliggande teckensekvensen.

Användningen av 'std::string_view' ger enkel åtkomst till enskilda tecken i strängen. I kodavsnittet hämtar och skriver 'literalView[0]' ut strängens första tecken, vilket visar upp enkelheten och direktheten i att komma åt elementen. 'Find'-metoden för 'std::string_view' används för att bestämma positionen för 'String'-delsträngen inom den ursprungliga strängen.

Exempel 4: Delsträngsextraktion

Uppgiften att extrahera delsträngar involverar att hämta en del av en given sträng baserat på specificerade kriterier såsom positionen för en avgränsare. Möjligheten att enkelt extrahera delsträngarna är en kraftfull funktion i 'std::string_view'. Tänk på ett scenario där vi behöver extrahera en del av en sträng baserat på en avgränsare:

#include
#inkludera

int main ( ) {
std::string fullString = 'äpple-apelsin-banan' ;
size_t delimiterPos = fullString.find ( '-' ) ;

std::string_view subString = fullString.substr ( 0 , avgränsarePos ) ;

std::cout << 'Extraherad delsträng: ' << understräng << std::endl;

lämna tillbaka 0 ;
}


I det här kodavsnittet börjar vi med deklarationen av en originalsträng, 'fullString', som initieras med värdet 'apple-orange-banana'. Vårt mål är att utföra delsträngsextraktionen. För att uppnå detta använder vi funktionen 'hitta' som tillhandahålls av standardbiblioteket C++.

När vi har identifierat positionen för avgränsaren inom 'fullString', lagrad i variabeln 'delimiterPos', extraherar vi den önskade delsträngen. Funktionen 'substr' anropas på den ursprungliga strängen och anger startpositionen (0) och längden på understrängen som är exakt positionen för avgränsaren. Denna operation resulterar i skapandet av 'std::string_view' med namnet 'subString' som representerar delen av den ursprungliga strängen från början upp till avgränsaren.

Exempel 5: Minneseffektiva datastrukturer

'std::string_view' spelar en avgörande roll vid utformningen av minneseffektiva datastrukturer. Istället för att lagra flera kopior av strängar kan datastrukturer lagra 'std::string_view'-instanserna, vilket minskar minneskostnaderna.

#include
#inkludera

struct Record {
std::string_view namn;
int ålder;
} ;

int main ( ) {

Rekordperson = { 'John Doe' , 30 } ;

std::cout << 'Namn: ' << person.namn << ', Ålder: ' << personlighet << std::endl;

lämna tillbaka 0 ;
}


I det här kodavsnittet visar vi upp användningen av 'std::string_view' i en minneseffektiv datastruktur. Vi definierar en 'Record'-struktur som består av en 'std::string_view'-medlem med namnet 'name' och en heltalsmedlem kallad 'age'. Användningen av 'std::string_view' i detta sammanhang tillåter oss att skapa en lätt representation av en sträng utan behov av ytterligare minnesallokering.

I 'huvud'-funktionen instansierar vi ett 'Record'-objekt med namnet 'person' med namnet 'John Doe' och en ålder av 30. 'std::string_view'-medlemmen 'name' fungerar som en icke-ägande vy av teckendata som motsvarar namnet, vilket eliminerar behovet av att duplicera strängens innehåll. 'std::cout << 'Namn: ' << person.namn << ', Ålder: ' << person.ålder << std::endl;' uttalandet matar ut namnet och åldern på personen som är lagrade i 'Record'-objektet.

Slutsats

I det ständigt föränderliga landskapet för C++-utvecklingen framstår 'std::string_view' som ett värdefullt tillägg till programmerarens verktygslåda. De fall som illustreras i den här artikeln belyser anpassningsförmågan och användbarheten av 'std::string_view' inom området för C++-programmering. Från effektiv strängmanipulation och sömlös interoperabilitet med äldre kod till minneseffektiva datastrukturer, 'std::string_view' är värdefullt för utvecklare som letar efter förbättrad prestanda och optimerad kod i olika scenarier. Dessa verkliga scenarier visar hur 'std::string_view' kan optimera koden, minska onödiga minneskostnader och bidra till den totala effektiviteten för C++-applikationer.