Widok ciągów w C++

Widok Ciagow W C



W dziedzinie programowania w C++ kluczowe znaczenie ma wydajność i wydajność. Klasa „std::string_view”, wprowadzona w C++ 17, stanowi wszechstronną i oszczędzającą pamięć alternatywę dla tradycyjnej manipulacji ciągami. W swojej istocie „std::string_view” jest odwołaniem niebędącym właścicielem do sekwencji znaków, zwykle reprezentującym podciąg większego ciągu. W przeciwieństwie do „std::string”, który jest właścicielem swoich danych i wewnętrznie zarządza pamięcią, „std::string_view” działa bez posiadania podstawowych danych. Ta cecha czyni ją szczególnie cenną w scenariuszach, w których obciążenie związane z kopiowaniem lub zarządzaniem pamięcią jest niepożądane. W tym artykule przeanalizujemy różne przykłady, aby zrozumieć wykorzystanie „std::string_view” w C++.

Przykład 1: Wydajna obsługa ciągów

We współczesnym rozwoju C++ wydajna obsługa ciągów ma kluczowe znaczenie dla optymalizacji wydajności i wykorzystania zasobów. Umożliwia efektywny dostęp i manipulowanie ciągami znaków bez konieczności realokacji lub duplikacji pamięci. Aby zilustrować tę koncepcję, przeanalizujmy praktyczny przykład.







Rozważ następujący fragment kodu:



#include
#include

unieważnij procesStringView ( std::string_view strView ) {

std::cout << 'Długość: ' << strView.długość ( ) << std::endl;
std::cout << 'Treść: ' << strView << std::endl;
}

int główny ( ) {

std::string oryginalnyString = „Efektywna obsługa ciągów” ;

std::string_view viewOfString ( oryginalny ciąg ) ;

procesStringView ( widokStringu ) ;

powrót 0 ;
}


W tym przykładzie mamy funkcję „processStringView”, która przyjmuje parametr „std::string_view”. Następnie funkcja wypisuje długość i zawartość widoku ciągu znaków przy użyciu standardowego wyjścia. Funkcja główna inicjuje „std::string” o nazwie „originalString” wartością „Efficient String Handling”. Następnie tworzony jest „std::string_view” o nazwie „viewOfString”, nawiązujący do zawartości „originalString”.



Przekazując „viewOfString” do funkcji „processStringView”, możemy efektywnie wykonywać operacje na ciągu znaków, eliminując konieczność dodatkowej alokacji pamięci. „std::string_view” to lekkie odniesienie do podstawowej sekwencji znaków „originalString” bez kopiowania danych.





Oto wygenerowany wynik:



Przykład 2: Interoperacyjność ze starszym kodem

W dziedzinie programowania w języku C++ płynna integracja nowych i starych baz kodu jest często krytycznym problemem. „std::string_view” umożliwia programistom bezproblemową interakcję ze starszymi funkcjami, które zwracają wskaźniki „const char”.

Rozważmy następujący przykład, który demonstruje praktyczne zastosowanie „std::string_view” dla interoperacyjności. Tutaj mamy starszą funkcję o nazwie „legacyFunction()”, która zwraca wskaźnik „const char”:

#include
#include

znak stały * funkcja starszego typu ( ) {
powrót „Starszy ciąg” ;
}

int główny ( ) {

std::string_view dziedzictwoStrView ( funkcja starszego typu ( ) ) ;

std::cout << „Starszy widok ciągu znaków:” << starszeStrView << std::endl;

powrót 0 ;
}


Zaczynamy od zdefiniowania starszej funkcji o nazwie „legacyFunction()”, która zwraca wskaźnik „const char” reprezentujący ciąg znaków oznaczony jako „Legacy String”. Aby bezproblemowo włączyć te starsze dane do naszego nowoczesnego programu C++, stosujemy „std::string_view”. W szczególności w funkcji main() tworzymy instancję „std::string_view” o nazwie „legacyStrView” i inicjujemy ją wynikiem starszej funkcji. Ta instancja pozwala nam efektywnie enkapsulować i pracować ze starszym wskaźnikiem „const char”.

W rezultacie możemy uzyskać dostęp do starszego ciągu i manipulować nim bez uciekania się do niepotrzebnego kopiowania danych, zachowując zarówno wydajność, jak i kompatybilność. Ostatni krok w kodzie polega na wykorzystaniu „std::cout” do wydrukowania zawartości starszego widoku ciągu znaków.

Wykonane wyjście to:

Przykład 3: Ulepszona obsługa literałów łańcuchowych

Literały łańcuchowe w C++ są tradycyjnie reprezentowane jako tablice znaków. „std::string_view” upraszcza pracę z literałami łańcuchowymi, zapewniając wygodny interfejs. Umożliwiając bezpośredni dostęp do podstawowej tablicy znaków bez konieczności jawnych konwersji, „std::string_view” usprawnia operacje na literałach łańcuchowych.

#include
#include

int główny ( ) {
znak stały * mójLiterał = „Witaj, widok ciągów!” ;
std::string_view widok literału ( mójDosłowny ) ;

std::cout << „Pierwszy znak:” << dosłownieWidok [ 0 ] << std::endl;

pozycja size_t = literalView.find ( 'Strunowy' ) ;
std::cout << „Pozycja podciągu:” << pozycja << std::endl;

powrót 0 ;
}


W tym przykładzie „Hello, String View!” literał ciągu jest przypisany do wskaźnika „myLiteral”. Wprowadzenie „std::string_view” ułatwia wydajniejszą reprezentację tego ciągu bez konieczności kopiowania jego zawartości. Obiekt „literalView” jest tworzony przy użyciu wskaźnika „myLiteral”, który pozwala nam przeglądać i manipulować leżącą u jego podstaw sekwencją znaków.

Użycie „std::string_view” zapewnia łatwy dostęp do poszczególnych znaków w ciągu. We fragmencie kodu „literalView[0]” pobiera i wypisuje pierwszy znak ciągu, demonstrując prostotę i bezpośredniość dostępu do elementów. Metoda „find” funkcji „std::string_view” służy do określenia pozycji podciągu „String” w oryginalnym ciągu.

Przykład 4: Ekstrakcja podłańcucha

Zadanie wyodrębnienia podciągu polega na pobraniu części danego ciągu na podstawie określonych kryteriów, takich jak położenie ogranicznika. Możliwość łatwego wyodrębnienia podciągów jest potężną funkcją „std::string_view”. Rozważmy scenariusz, w którym musimy wyodrębnić część ciągu znaków w oparciu o ogranicznik:

#include
#include

int główny ( ) {
std::string pełnyString = „jabłko-pomarańcza-banan” ;
size_t delimiterPos = fullString.find ( „-” ) ;

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

std::cout << „Wyodrębniony podciąg: „ << podciąg << std::endl;

powrót 0 ;
}


W tym fragmencie kodu zaczynamy od deklaracji oryginalnego ciągu „fullString”, który jest inicjowany wartością „jabłko-pomarańcza-banan”. Naszym celem jest wykonanie ekstrakcji podciągu. Aby to osiągnąć, używamy funkcji „znajdź” dostarczanej przez standardową bibliotekę C++.

Po zidentyfikowaniu pozycji ogranicznika w „fullString” przechowywanym w zmiennej „delimiterPos” wyodrębniamy żądany podciąg. Na oryginalnym łańcuchu wywoływana jest funkcja „substr”, określająca pozycję początkową (0) i długość podciągu, czyli dokładnie położenie ogranicznika. Ta operacja powoduje utworzenie „std::string_view” o nazwie „subString”, który reprezentuje część oryginalnego ciągu od początku aż do ogranicznika.

Przykład 5: Struktury danych oszczędzające pamięć

Widok „std::string_view” odgrywa kluczową rolę w projektowaniu struktur danych oszczędzających pamięć. Zamiast przechowywać wiele kopii ciągów, struktury danych mogą przechowywać instancje „std::string_view”, zmniejszając w ten sposób obciążenie pamięci.

#include
#include

Rekord struktury {
std::string_view nazwa;
wiek całkowity;
} ;

int główny ( ) {

Rekordowa osoba = { 'Nieznany z nazwiska' , 30 } ;

std::cout << 'Nazwa: ' << imię osoby << ', Wiek: ' << osobistość << std::endl;

powrót 0 ;
}


W tym fragmencie kodu prezentujemy wykorzystanie „std::string_view” w strukturze danych oszczędzającej pamięć. Definiujemy strukturę „Rekord”, która składa się z elementu „std::string_view” o nazwie „name” i elementu całkowitego o nazwie „age”. Użycie „std::string_view” w tym kontekście pozwala nam stworzyć lekką reprezentację ciągu znaków bez potrzeby dodatkowej alokacji pamięci.

W funkcji „main” tworzymy instancję obiektu „Record” o nazwie „person” o nazwie „John Doe” i wieku 30. Element „std::string_view” „name” służy jako widok niebędący właścicielem dane znakowe odpowiadające nazwie, eliminując konieczność powielania treści ciągu. „std::cout << „Imię: ” << imię.osoby << „, Wiek: ” << osoba.wiek << std::endl;” instrukcja wyprowadza imię i wiek osoby, które są przechowywane w obiekcie „Rekord”.

Wniosek

W stale rozwijającym się środowisku rozwoju C++ „std::string_view” wyróżnia się jako wartościowy dodatek do zestawu narzędzi programisty. Przykłady zilustrowane w tym artykule podkreślają możliwości adaptacji i użyteczność „std::string_view” w dziedzinie programowania C++. Od wydajnej manipulacji ciągami i płynnej interoperacyjności ze starszym kodem po struktury danych oszczędzające pamięć, „std::string_view” jest cenne dla programistów, którzy szukają zwiększonej wydajności i zoptymalizowanego kodu w różnych scenariuszach. Te rzeczywiste scenariusze pokazują, jak „std::string_view” może zoptymalizować kod, zmniejszyć niepotrzebne obciążenie pamięci i przyczynić się do ogólnej wydajności aplikacji C++.