====== String ======
Klasa **string** jest kontenerem przeznaczonym do przechowywania łańcuchów znaków. Stanowi pewnego rodzaju opakowanie dla tablic znaków znanych z C, zawiera także wiele funkcji przydatnych do operowania na napisach. Przy programowaniu obiektowym klasa **string** zastępuje używanie tabic znaków i biblioteki cstring.
Aby móc używac obiektów typu **string** należy dołączyć do programu odpowiedni nagłówek:
#include
====== Metody klasy string ======
===== Spis =====
^ Podstawowe ^^
|[[string#Konstruktory|Konstruktor]]| Tworzy nowy obiekt |
|[[string#operator=|operator=]] | Operator przypisania |
^ Iteratory ^^
| iterator begin();
const_iterator begin() const;
|Zwraca iterator na pierwszy znak napisu |
| iterator end();
const_iterator end() const;
|Zwraca iterator wskazujący na miejsce za ostatnim znakiem |
| reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
|Zwraca wsteczny iterator wskazujący na ostatni znak napisu |
| reverse_iterator rend();
const_reverse_iterator rend() const;
|Zwraca wsteczny iterator wskazujący na miejsce przed pierwszym znakiem |
^Rozmiar^^
|size_t size() const;
|Zwraca ilość znaków w napisie (to samo co length())|
|size_t length() const;
|Zwraca ilość znaków w napisie (to samo co size())|
|size_t max_size ( ) const;
|Zwraca maksymalny dozwolony rozmiar napisu |
|void resize ( size_t n, char c );
void resize ( size_t n );
|Zmienia rozmiar napisu (skraca lub wydłuża). \\ Jeśli podany będzie dodatkowy argument //c//, po wydłużeniu napisu wolne miejsca zostaną wypełnione podanym znakiem. |
|size_t capacity ( ) const;
|Zwraca wielkość aktualnie zarezerwowanej dla napisu pamięci. //capacity >= size//. W razie potrzeby dodatkowa pamięć jest alokowana automatycznie. |
|void reserve ( size_t res_arg=0 );
|Wymusza zarezerwowanie ustalonej pamięci dla napisu. Jeśli podany argument jest mniejszy od aktualnej długości napisu, ilość pamięci jest zmniejszana do wielkości gwarantującej przechowanie dotychczasowego napisu. |
|void clear();
|Czyści napis |
|bool empty ( ) const;
|Sprawdza, czy napis jest pusty |
^Dostęp do znaków^^
|const char& operator[] ( size_t pos ) const;
char& operator[] ( size_t pos );
|Zwraca znak na pozycji //pos//. |
|const char& at ( size_t pos ) const;
char& at ( size_t pos );
|Zwraca znak na pozycji //pos//. Działa podobnie do operatora [], z tym że funkcja at() wykonuje sprawdzenie zakresu i w wypadku jego przekroczenia rzuca wyjątek //out_of_range//.|
^Modyfikacja^^
|[[string#operator+=]] |Dopisuje znaki na końcu napisu |
|[[string#append]] |Dopisuje znaki na końcu napisu |
|void push_back ( char c );
|Dodaje znak //c// na koniec napisu |
|[[string#assign]] |Zastępuje dotychczasowy napis nowym |
|[[string#insert]] |Wstawia dodatkowe znaki do napisu |
|[[string#erase]] |Usuwa znaki z napisu |
|[[string#replace]] |Zmienia część napisu |
|size_t copy ( char* s, size_t n, size_t pos = 0) const;
|Kopiuje do tablicy //s// //n// znaków zaczynając od pozycji //pos//. Nie jest dopisywany znak '\0'. Odpowiednia ilość pamięci dla //s// powinna być przydzielona przed wywołaniem funkcji. |
|void swap ( string& str );
|Zamienia zawartość aktualnego napisu z napisem //str//. |
^Operacje dodatkowe^^
|const char* c_str ( ) const;
|Zwraca wskaźnik na tablicę znaków zakończoną zerem reprezentującą zawartość napisu. |
|const char* data ( ) const;
|Zwraca wskaźnik na wewnętrzną tablicę przechowującą znaki napisu. Łańsuch nie zawiera kończącego zera. |
|[[string#find]] |Wyszukuje pierwsze wystąpienie znaku/ciągu w napisie |
|[[string#find|rfind]] |Wyszukuje ostatnie wystąpienie znaku/ciągu w napisie |
|[[string#find|find_first_of]] |Wyszukuje pierwsze wystąpienie jednego z podanych znaków |
|[[string#find|find_last_of]] |Wyszukuje ostatnie wystąpienie jednego z podanych znaków |
|[[string#find|find_first_not_of]] |Wyszukuje pierwsze wystąpienie znaku nie podanego jako argument |
|[[string#find|find_last_not_of]] |Wyszukuje ostatnie wystąpienie znaku nie podanego jako argument |
|string substr ( size_t pos = 0, size_t n = npos ) const;
|Zwraca podciąg aktualnego napisu zaczynający się na pozycji //pos// i składający się maksymalnie z //n// znaków |
|[[string#compare]] |Porównuje dwa stringi |
===== Konstruktory =====
Istnieje kilka metod tworzenia obiektów klasy string.
\\
\\
explicit string ( );
Tworzy pusty napis.
\\
\\
string ( const string& str );
Kopiuje do nowego napisu zawartość już istniejącego.
\\
\\
string ( const string& str, size_t pos, size_t n = npos );
Tworzy nowy napis i kopiuje do niego podciąg napisu podanego jako argument. Kopiowana jest część zaczynająca się na pozycji //pos// i zawierająca conajwyżej //n// znaków (jeśli napis jest krótszy niż //pos+n//, kopiowane są znaki od pozycji //pos// do końca napisu).
\\
\\
string ( const char * s, size_t n );
Nowy napis jest tworzony poprzez kopiowanie //n// znaków z tablicy znaków wskazywanej przez //s//.
\\
\\
string ( const char * s );
Nowy napis jest tworzony poprzez skopiowanie łańcucha znaków zakończonego zerem wskazywanego przez //s//.
\\
\\
string ( size_t n, char c );
Tworzony jest napis zawierający //n// wystapień znaku //c//.
\\
\\
template
string (InputIterator begin, InputIterator end);
Jeśli //InputIterator// jest typu całkowitego, jego argumenty są rzutowane na odpowiednie typy i wywoływany jest konstruktor wymieniony wyżej.
string(static_cast(begin),static_cast(end));
W przeciwnym wypadku argumenty są traktowane jak iteratory i napis jest tworzony przez skopiowanie do stringa wszystkich elementów poczynając od //begin// a kończąc na elemencie poprzedzającym //end//.
===== Przypisanie =====
string& operator= ( const string& str );
string& operator= ( const char* s );
string& operator= ( char c );
Operator przypisania dla napisów.
* //str// - obiekt klasy string
* //s// - łańcuch znaków zakończony zerem
* //c// - po przypisaniu zawartość napisu stanowi pojedynczy znak
W każdym przypadku zwracaną wartością jest //*this//.
===== Modyfikacja =====
=== operator += ===
string& operator+= ( const string& str );
string& operator+= ( const char* s );
string& operator+= ( char c );
Dopisuje na końcu napisu kopię danych podaną jako argument.
Rozszerzoną funkcjonalność oferuje funkcja append.
=== append ===
string& append ( const string& str );
Dopisuje na końcu napisu kopię podanego argumentu.
string& append ( const string& str, size_t pos, size_t n );
Dopisuje na końcu podciąg podanego argumentu zaczynający się na pozycji //pos// i składający się z //n// znaków (bądź mniej, jeśli napis się skończy wcześniej). Jeśli //pos// jest większy niż długość napisu zgłaszany jest wyjątek //out_of_range//
string& append ( const char * s, size_t n );
Dopisuje na końcu pierwsze //n// znaków z tablicy wskazywanej przez //s//.
string& append ( const char * s );
Dopisuje na końcu napis wskazywany przez s, kończący się znakiem '\0'.
string& append ( size_t n, char c );
Dopisuje na końcu //n// razy znak //c//.
template string& append (InputIterator first, InputIterator last);
Dopisuje na końcu wszystie znaki zaczynając od wskazywanego przez //first// a kończąc na znaku poprzedzającym //last//.
=== assign ===
string& assign ( const string& str );
string& assign ( const string& str, size_t pos, size_t n );
string& assign ( const char* s, size_t n );
string& assign ( const char* s );
string& assign ( size_t n, char c );
template
string& assign ( InputIterator first, InputIterator last );
Działanie assign polega na przypisaniu do napisu zawartości podanej jako argument. Argumenty interpretowane są identycznie jak w funkcji append.
=== insert ===
string& insert ( size_t pos1, const string& str );
Wstawia cały napis //str// na pozycji //pos1//.
string& insert ( size_t pos1, const string& str, size_t pos2, size_t n );
Wstawia do napisu na pozycji //pos1// podciąg napisu //str// zaczynający się na pozycji //pos2// i zawierający do //n// znaków.
string& insert ( size_t pos1, const char * s, size_t n );
Wstawia na pozycji //pos1// pierwsze //n// znaków z tablicy //s//.
string& insert ( size_t pos1, const char * s );
Wstawia na pozycji //pos1// cały napis wskazywany przez //s// (napis musi być zakończony znakiem '\0').
string& insert ( size_t pos1, size_t n, char c );
Wstawia na pozycji //pos1// //n// znaków //c//.
iterator insert ( iterator p, char c );
Wstawia na pozycji wskazywanej przez iterator //p// znak //c//. Zwracany jest iterator na wstawiony znak.
void insert ( iterator p, size_t n, char c );
Wstawia na pozycji wskazywanej przez iterator //p// //n// znaków //c//.
template void insert (iterator p, InputIterator first, InputIterator last);
Wstawia na pozycji wskazywanej przez iterator //p// wszystkie znaki zaczynając od wskazywanego przez //first//, kończąc na znaku poprzedzającym //last//.
=== erase ===
string& erase ( size_t pos = 0, size_t n = npos );
Usuwa z napisu //n// znaków zaczynając od tego na pozycji //pos//. Jeśli //n// większe od długości napisu, usuwane są znaki do końca napisu.
iterator erase ( iterator p );
Usuwa jeden znak, wskazywany przez iterator //p//.
iterator erase ( iterator first, iterator last );
Usuwa znaki zaczynając od tego wskazywanego przez //first// a kończac na poprzedzającym //last//.
=== replace ===
Zamienia część napisu na inną, podaną jako argument. Większość funkcji występuje w dwóch wersjach - pierwsza z nich określa fragment napisu do zmiany poprzez podanie pozycji pierwszego znaku //pos1// oraz długości //n1//, druga określa go poprzez podanie iteratorów //i1// i //i2//.
string& replace ( size_t pos1, size_t n1, const string& str );
string& replace ( iterator i1, iterator i2, const string& str );
Wybrany fragment jest zamieniany na cały napis //str//.
string& replace ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 );
Wybrany fragment jest zamieniany na podciąg napisu //str// zaczynający się na pozycji //pos2// i zawierający do //n2// znaków.
string& replace ( size_t pos1, size_t n1, const char * s, size_t n2 );
string& replace ( iterator i1, iterator i2, const char * s, size_t n2 );
Wybrany fragment jest zamieniany na pierwsze //n2// znaków z tablicy //s//.
string& replace ( size_t pos1, size_t n1, const char * s );
string& replace ( iterator i1, iterator i2, const char * s );
Wybrany fragment jest zamieniany na napis wskazywany przez //s// (zakończony znakiem '\0').
string& replace ( size_t pos1, size_t n1, size_t n2, char c );
string& replace ( iterator i1, iterator i2, size_t n2, char c );
Wybrany fragment jest zamieniany na //n2// wystąpień znaku //c//.
template string& replace (iterator i1, iterator i2, InputIterator j1, InputIterator j2);
Wybrany fragment jest zamieniany na znaki znajdujące się pomiedzy iteratorami //j1// i //j2//.
===== Operacje dodatkowe =====
=== find ===
Do wyszukiwania podciągów w napisie służą dwie grupy funkcji. Pierwsza z nich wyszukuje cały napis podany jako argument, druga służy do wyszukiwania wystąpień dowolnego znaku z podanego napisu.
size_t find ( const string& str, size_t pos = 0 ) const;
size_t find ( const char* s, size_t pos, size_t n ) const;
size_t find ( const char* s, size_t pos = 0 ) const;
size_t find ( char c, size_t pos = 0 ) const;
Wyszukaj pierwsze wystąpienie podanego ciągu w napisie. W czasie wyszukiwania w bieżącym napisie brane pod uwagę są tylko znaki od pozycji //pos//. Jeśli został użyty parametr //n//, oznacza on liczbę znaków w tablicy wskazywanej przez //s//, w przeciwnym wypadku //s// powinno wskazywać na napis zakończony zerem.
W celu wyszukania ostatniego wystąpienia danego ciągu należy użyć funkcji rfind o identycznej składni.
size_t find_first_of ( const string& str, size_t pos = 0 ) const;
size_t find_first_of ( const char* s, size_t pos, size_t n ) const;
size_t find_first_of ( const char* s, size_t pos = 0 ) const;
size_t find_first_of ( char c, size_t pos = 0 ) const;
Wyszukaj pierwsze wystąpienie dowolnego znaku znajdującego się w podanym ciągu. Parametry mają takie samo znaczenie jak przy funkcji //find//.
Pozostałe 3 wersje tej funkcji to:
* find_last_of - wyszukuje ostatnie wystąpienie dowolnego znaku z podanego ciągu
* find_first_not_of - wyszukuje pierwszy znak nie będący fragmentem podanego ciągu
* find_last_not_of - jw, z tym że wyszukuje ostatni taki znak
=== compare ===
int compare ( const string& str ) const;
int compare ( const char* s ) const;
Porównuje cały napis z podanym argumentem. Równoważne z
*this == str;
*this == s;
int compare ( size_t pos1, size_t n1, const string& str ) const;
int compare ( size_t pos1, size_t n1, const char* s) const;
Porównuje napis podany jako argument z podciągiem aktualnego napisu złożonego z //n1// znaków zaczynającym się na pozycji //pos1//. Równowazne z
(*this).substr(pos1, n1) == str;
(*this).substr(pos1, n1) == s;
int compare ( size_t pos1, size_t n1, const string& str, size_t pos2, size_t n2 ) const;
Porównuje fragment napisu podanego jako argument z podciągiem aktualnego napisu złożonego z //n1// znaków zaczynającym się na pozycji //pos1//. Równowazne z
(*this).substr(pos1, n1) == str.substr(pos2, n2);
int compare ( size_t pos1, size_t n1, const char* s, size_t n2) const;
Porównuje //n2// pierwszych znaków z tablicy //s// z podciągiem aktualnego napisu złożonego z //n1// znaków zaczynającym się na pozycji //pos1//.
===== Porównanie operacji na napisach w C i C++ =====
^ operacja ^ C ^ C++ ^
| Porównanie zawartości | strcmp(s1, s2) | s1 == s2 (!=, <, > etc) / s1.compare(s2, ...) |
| Dopisanie na koniec | strcat(s1, "...") | s1 += "..." / s1.append("...", ...) |
| Kopiowanie zawartości | strcpy(s1, s2) | s1 = s2 / s1.assign(s2) |
| Długość | strlen(s1) | s1.size() |
| Wyszukiwanie napisu | strstr(s1, "napis") | s1.find("napis")|
| Wyszukiwanie jednego ze znaków | strspn(s1, "abc") | s1.find_first_of("abc") |
| Podział na podnapisy | strtok(s1, " ") | brak |
===== Odnośniki =====
[[http://www.cplusplus.com/reference/string/string/|C++ Reference]] \\
[[http://pl.wikibooks.org/wiki/C%2B%2B:String|Wikibooks, biblioteka wolnych podręczników]] \\
----
--- //[[maciek.slon@gmail.com|Maciej Stefańczyk]] 2008/12/11 21:52//