C++, Programowanie

Metody klasy String C++

metody klasy string c++

Klasa String przetwarzająca ciągi znakowe w C++ wykorzystywana jest w znacznej części programów napisanych z wykorzystaniem tej technologii. W końcu operacje na łańcuchach znaków to chleb powszedni dla wielu aplikacji.  Na szczęście człowiek jest na tyle leniwym stworzeniem, aby opracować dedykowaną tym operacjom klasę. Tak, aby każdy programista chcący zaimplementować działania na tekście, nie był zmuszony do wymyślania koła na nowo. Zapraszam, szczególnie początkujących programistów C++ do zapoznania się z wybranymi metodami klasy String w C++.

Porównanie klasy String z typem char

Te porównanie dla wielu wydawać się może bezcelowe, ale od czegoś trzeba zacząć. W dodatku takie zestawienie z pewnością przyniesie korzyść osobom początkującym, którym dedykuję ten wpis.

Typ char (ang. character) jest wbudowanym typem języka C++ służącym do reprezentacji pojedynczego znaku o wielkości 1 bajta. Stąd zmienna tego typu może przechowywać tylko jeden znak pod postacią liczbową od -128 do 127. Można śmiało założyć, że poza rozmiarem typ ten niczym nie różni się od pozostałych typów prostych języka. Wszakże zmienną typu int też możemy zmusić do wyświetlania znaków prostym zabiegiem: cout << char(290);. Chcąc posłużyć się więcej, niż jednym znakiem tworząc łańcuch, musimy użyć w tym celu typu tablicowego, który umożliwi nam umieszczenie znaków w tablicy jeden po drugim tak aby tworzyły planowanych ciąg. Przychodzą mi trzy, niewywołujące mdłości u kompilatora metody na zaimplementowanie ciągu znaków za pomocą typu char:

 

Typowi char można oddać niską złożoność pamięciową. Wystarczy jeden wskaźnik w postaci nazwy tablicy, aby odwołać się do całego ciągu.

Opis klasy String należy zacząć od prostej obserwacji. Nie jest to wbudowany typ prosty języka, a zaprojektowana klasa – typ złożony zawierający własne zmienne i metody. Wchodzi w skład przestrzeni nazw std. Służy do reprezentacji ciągu znaków. Posiada rozbudowany zestaw metod dostosowanych do działań na łańcuchach takich jak:

  • Wyszukiwanie znaków,
  • Zamiana znaków,
  • Wstawianie nowych znaków,
  • Usuwanie znaków

Większość funkcji umożliwiających operowanie na zmiennych typu char pochodzi z pliku nagłówkowego string.h/cstring. Należy uważać, bowiem nie jest to ten sam plik co w przypadku klasy String w C++.  Chcąc z niej skorzystać zawrzemy w kodzie dyrektywę #include <string>.

 

Tworzenie obiektu klasy String

Obiekty klasy String możemy tworzyć za pomocą przeładowanego konstruktora klasy – funkcji inicjalizującej, wywoływanej przy tworzeniu nowego obiektu. Oto lista wybranych konstruktorów:

string() – konstruktor domyślny, tworzy pusty ciąg znaków.

string(const char *s) – konstruktor inicjalizuje obiektu za pomocą przekazanego jako argument parametru w postaci ciągu znaków. Przykład użycia:

 

string(const string & str) – konstruktor inicjalizuje obiekt za pomocą przekazanego jako argument innego obiektu klasy String. Przykład użycia:

 

string(size_t n , char c) – konstruktor tworzący obiekt zawierający łańcuch złożony z n wystąpień znaku c. Przykład użycia:

 

string(const char *s, size_t n) – konstruktor tworzący łańcuch o długości n znaków, rozpoczynający się od ciągu s. Przykład użycia:

 

string(const string & str, size_t pos, size_t n = npos) – konstruktor kopiujący do obiektu n znaków z przekazanego parametru str począwszy od indeksu pos. Parametr n domyślnie zawiera liczbę stanowiącą limit długości łańcucha znaków obiektu klasy String. Przykład użycia:

 

template <class Iter>

string  (Iter begin, Iter end) – inicjalizuje obiekt wartościami z przedziału [begin, end) co oznacza, że znak znajdujący się pod wskaźnikiem – end nie zostanie ujęty w przedziale. Przykład użycia:

 

Metody klasy String dotyczące pamięci przechowującej dane

Funkcje tutaj wymienione służą do czytania oraz edytowania wielkości pamięci przechowującej łańcuchy znaków.

size() / length() – obie metody zwracają ilość pojedynczych znaków w łańcuchu.

resize() – zmienia długość przechowywanego znaku.

max_size() – zwraca maksymalną długość jaką może osiągnąć łańcuch. Zwracana wartość może różnić się od parametru npos, który stanowi maksymalną wielkość zmiennej przechowującej długość łańcucha.

capacity() – zwraca ilość bajtów zarezerwowaną dla łańcucha.

reserve() – za pomocą tej metody ustalamy ilość bajtów zarezerwowaną dla łańcucha.

shrink_to_fit() – metoda ta dostosowuje ilość bajtów zarezerwowaną dla łańcucha do jego długości.

empty() – metoda zwraca prawdę, jeżeli łańcuch jest pusty, tzn. ma długość równą zero oraz fałsz w przeciwnym wypadku.

clear() – usuwa wszystkie znaki zawarte w łańcuchu.

 

Elementy dostępu klasy String

Do poszczególnych elementów obiektu, znaków w łańcuchu możemy dostać się na następujące sposoby:

  • Korzystając z operatora nawiasów kwadratowych [] tak jak ma to miejsce w przypadku tablic,
  • Korzystając z metody .at() zwracającej znak pod indeksem przekazanym do niej,
  • Korzystając z metody .back() zwracającej znak na ostatniej pozycji w łańcuchu,
  • Korzystając z metody .front() zwracającej znak na pozycji 0 w łańcuchu
 

Wybrane metody klasy String C++

Trochę ograniczę swoje zapędy żeby wpis nie okazał się spolszczeniem dokumentacji 😀

 

.c_str() – przydatna funkcja w momencie, gdy potrzebujemy otworzyć plik tekstowy. Klasa Fstream i jej metody przewidują przekazywanie wskaźnika do tablicy znaków (char) jako nazwy otwieranego pliku. Metoda ta zwraca właśnie taki wskaźnik do tablicy znaków zawierającej łańcuch z obiektu, na którym jest wywoływany z dołączonym znakiem pustym ‘/0’.  Przykład zastosowania:

Od C++11 klasa Fstream nie wymaga przekazywania wskaźnika do tablicy.

 

.push_back(char c) – dołącza na koniec łańcucha przekazany znak. Jego przeciwieństwem jest .pop_back(). Ta metoda usunie ostatni znak z łańcucha. Przykład użycia:

 

.find() – przeładowana funkcja służąca do znajdowania pojedynczych znaków, bądź całych ciągów znaków w łańcuchu. Funkcja przydatna w momencie, gdy chcemy np. sprawdzić czy dane ciąg zawiera poszukiwany podciąg. Przykład użycia:

 

.compare(const string &str) i .compare(const char * s) – metoda ta służy do porównywania zawartości łańcucha przechowywanego w obiekcie do zadanego ciągu według wielkości odpowiadających znakom liczb w tablicy znaków ASCII. Z uwagi na to cyfry będą interpretowane jakby były przed wielkimi literami, a te z kolei mają pierwszeństwo przed małymi literami. Funkcja zwraca:

  • 0 – gdy teksty są takie same,
  • <0 – gdy tekst z obiektu, na którym wywoływana jest „pierwszy” według w.w. kolejności,
  • >0 – gdy tekst przekazany jako parametr jest „pierwszy”

Z reguły zwracanymi wartościami, gdy teksty nie są identyczne, są -1 i 1, ale gdy do pewnego momentu teksty są takie same, a następnie jeden się skończy to zwrócone liczby  informują o różnicy w długości porównywanych łańcuchów.

Przykład użycia:

 

.substr(size_t pos=0, size_t n = npos) – funkcja zwraca łańcuch znaków począwszy od indeksu pos o długości n, generowany na podstawie obiektu. Przykład użycia:

 

Podsumowanie

Na ten moment to wszystko ode mnie. Klasa String ma bardzo wiele do zaoferowania dlatego zapraszam do zapoznania się z dokumentacją LINK oraz do eksperymentowania.

 

 

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *