Widok ciągów C ++

Widok ciągów C ++
Liczenie indeksu znaków ciągu zaczyna się od zera (nie jeden). Zakres ciągów jest ciągłą sekwencją znaków z literatu smyczkowego. Cały ciąg to jeden duży zakres. Mniejsze zakresy można uzyskać z łańcucha. Ideą widoku ciągów jest uzyskanie zdecydowanego zakresu od ciągu, tak że zakres jest jak niezależny ciąg. Chociaż obiekt z widokiem na string może być samodzielny, jest oficjalnie widokiem zasięgu i nie można go zmieniać zwykle.

Widok ciągu jest klasą własnej biblioteki, która powinna być zawarta w programie C ++ w następujący sposób:

#włączać

Ma funkcje członków, które zostały skategoryzowane w następujących nagłówkach: konstrukcja, pojemność, dostęp do elementów, obsługa iteratora, modyfikatory, operacje ciągów i wyszukiwanie. Dziwnie, String_View ma modyfikatory, które są sprzeczne z jego definicją. To jest wyjaśnione poniżej w tym samouczku. Cały kod widoku ciągu w tym samouczku znajduje się w funkcji C ++ Main ().

Treść artykułu

  • Budowa
  • Pojemność
  • Dostęp do elementu
  • Obsługa iteratora
  • Modyfikatory
  • Operacje ciągów
  • Badawczy
  • Wniosek

Budowa
basic_string_view (const wykres* str)

To konstruuje widok łańcucha z całego string. Poniżej ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
string_view Strv (str);
Cout <powrót 0;

Wyjście to:

jeden dwa trzy cztery pięć

Zwróć uwagę, że String_View, zamiast Basic_String_View, został użyty dla nazwy konstruktora.

basic_string_view (const wykres* str, size_type len)

Ta funkcja członka oknie pierwsze znaki LEN argumentu stringowego. Okno nie kopiuje. Brak kopii konstruktora string-view. Po prostu odwołują się. Poniższy program pokazuje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
Cout <powrót 0;

Wyjście to:

raz Dwa Trzy

basic_string_view (const basic_string_view &)

Ten konstruktor jest taki sam jak pierwszy konstruktor powyżej, ale jego argumentem jest obiekt String_View, który już miał swój widok. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
String_View Strvv (Strv);
Cout <powrót 0;

Wyjście to:

raz Dwa Trzy

basic_string_view & operator = (const basic_string_view &)

Ten konstruktor członka jest podobny do powyższego, ale String_View jest przypisany i nie jest przekazywany jako argument. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
string_view strvv = strv;
Cout <powrót 0;

Wyjście to:

raz Dwa Trzy

Pojemność
size_type size () const

Pamiętaj, że String_View to zakres od oryginalnego ciągu. To nie jest kopia zakresu. Ma odniesienia do elementów znaków zakresu w oryginalnym ciągu. Rozmiar tego String_View (Window View) może być nadal określony, ponieważ String_View to obiekt utworzony z klasy String_View. Rozmiar jest zwracany przez funkcję elementu rozmiar (). Poniższy program pokazuje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
int sz = strv.rozmiar();
Cout <powrót 0;

Wyjście to:

13

bool pusty () const

Obiekt String_View może zostać utworzony pusty, jak pokazano w następującym programie. Gdy pusta funkcja członka pustego () zwróci true; W przeciwnym razie zwróci fałsz. Program to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

string_view strv;
Bool Bl = Strv.pusty();
Cout <powrót 0;

Dane wyjściowe to 1, dla prawda. Zauważ, że obiekt String_View został utworzony bez nawiasów i bez argumentu.

Dostęp do elementu
const_reference operator [] (size_type POS) const

Do odczytania wartości (znaku) w String_View można użyć operatora wsporników kwadratowych. Poniższy program wykorzystuje pętlę, aby to zilustrować:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
dla (int i = 0; i Cout <Cout <powrót 0;

Wyjście to:

raz Dwa Trzy

UWAGA: Postacie w obiekcie String_View nie można zmienić. Każda możliwa zmiana należy dokonać w oryginalnym ciągu.

Obsługa iteratora
const_iterator start () const

Ta funkcja członka zwraca stały iterator, który wskazuje na pierwszy element znaku obiektu String_View. Tutaj const_iterator oznacza, że ​​postać nie można zmienić. Iterator można jednak zwiększyć, aby wskazać następny element znaku; lub dodaj liczbę całkowitą podobną do dodania liczby całkowitej do indeksu, aby wskazać inny element postaci. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
string_view :: const_iterator it = strv.zaczynać();
it ++;
it = it + 4;
Cout <<*it <powrót 0;

Wyjście to „w”. Zauważ, że iterator został zbudowany.

const_iterator end () const

Ta funkcja członka zwraca stały iterator, który wskazuje tuż po ostatnim elemencie znaku obiektu String_View. Iterator można zmniejszyć, aby wskazać ostatni element znaku lub odejmować liczbę całkowitą, podobnie do odejmowania liczby całkowitej od indeksu, aby wskazać inny element znaków. Tutaj const_iterator oznacza, że ​​postać nie można zmienić. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
string_view :: const_iterator it = strv.koniec();
To--;
it = it - 4;
Cout <<*it <powrót 0;

Wyjście to „t”.

Modyfikatory
void remove_prefix (size_type n)

To usuwa pierwsze podniszczenie z String_View, ale nie usuwa żadnego znaku z oryginalnego ciągu. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
Cout <Strv.usuń_prefix (4);
Cout <Cout <powrót 0;

Wyjście to:

raz Dwa Trzy
dwa trzy
jeden dwa trzy cztery pięć

void remove_suffix (size_type n)

To usuwa ostatnie podstęp z String_View, ale nie usuwa żadnego znaku z oryginalnego ciągu. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
Cout <Strv.remove_suffix (6);
Cout <Cout <powrót 0;

Wyjście to:

raz Dwa Trzy
jeden dwa
jeden dwa trzy cztery pięć

Operacje ciągów
Kopia size_typ (wykres* s, size_type n, size_type pos = 0) const

Ta funkcja kopiuje zakres znaków z obiektu String_View (nie oryginalny ciąg), aby zastąpić pierwsze podtrepanie innego ciągu. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

char st [] = "aaa bbb ccc ddd eee";
const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
Cout <Strv.kopia (STRB, 3, 4);
Cout <Cout <powrót 0;

Wyjście to:

raz Dwa Trzy
dwa BBB CCC DDD EEE
jeden dwa trzy cztery pięć

Są tutaj dwa niezależne struny. String_View nie jest niezależnym ciągiem. Jest to okno zasięgu jednego z niezależnych ciągów. Zauważ, że pierwszy parametr funkcji członka, „wykres* s” oznacza tablicę szyjów, a nie const-char* .

int Porównaj (basic_string_view s) const

Liczba znaków dwóch String_Views jest porównywana tutaj. Jeśli jeden, stosując funkcję członka Porównaj (), jest wyższa, wówczas zwraca liczbę dodatnią. Jeśli liczby są równe, zero jest zwracane. Jeśli obiekt String_View, który wykorzystuje funkcję członka, ma niższą liczbę, zwrócono liczbę ujemną. Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* stra = „jeden dwa trzy cztery pięć”;
String_View Strva (Stra, 13);
Cout <const char* strb = "aaa bbb ccc ddd eee";
String_View Strvb (STRB, 11);
Cout <int ret = strvb.Porównaj (strva);
Cout <powrót 0;

Wyjście to:

raz Dwa Trzy
AAA BBB CCC
-14, na komputerze autora.

Badawczy
size_type Find (const wykres* s, size_type pos = 0) const

Ta funkcja członka szuka wystąpienia pierwszego substring. Zwraca wskaźnik pierwszego znaku znalezionego podstępu. Jeśli nie znaleziono, zwraca -1. Drugi argument mówi, gdzie zaczyna się wyszukiwanie (domyślny indeks to 0). Poniższy program ilustruje to:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

const char* str = "jeden dwa trzy cztery pięć";
String_View Strv (Str, 13);
Cout <const char* cs = "dwa";
int ret = strv.znaleźć (CS, 0);
Cout <powrót 0;

Wyjście to:

raz Dwa Trzy
4

Wniosek

String_view to widok okna zakresu oryginalnego ciągu. To nie jest kopia znaków. Postacie są określane. Istnieje klasa widoku ciągu, z której instancje są instancje. String-View ma wiele funkcji członka. Podstawowe funkcje członków z różnych kategorii zostały wyjaśnione powyżej.