Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2008 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu na temat programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłacznie do własnych prywatnych potrzeb i może on być kopiowany wyłacznie w całości, razem z niniejsza strona tytułowa.
Ogólnie 1 Klasa łańcuchów została zaprojektowana, tak aby można je było wykorzystywać tak jak normalne typy wbudowane. Pozwala to ułatwić przetwarzanie tekstów Jedna z najważniejszych cech typu std::string jest to że jest zdefiniowana dla niego operacja kopiowania z wykorzystaniem zarówno konstruktora kopiujacego jak też operatora =. Rozwiazuje to problem dynamicznego przydziału i zwalniania pamięci, co na poziomie języka C jest zawsze kłopotliwe. Zdefiniowane sa operacje porównywania łańcuchów (operatory: ==, <, >, <=, >=,!=), oraz operacja konkatenacji (operatory: +, +=). Dostępnych jest wiele dodatkowych udogodnień pozwalajacych na wyszukiwaniu znaków lub podciagów, wstawianie sekwencji znaków, zamiany itp. Nie sa zdefiniowane metody wyszukiwania w oparciu o wyrażenia regularne.
Podstawowe cechy klasy std::string 2 std::string UniwersalneZyczenia( const char Naglowek, const char Zakonczenie ) { std::string Zyczenia = Naglowek; } Zyczenia += wszystkiego najlepszego zyczy\n ; Zyczenia += Zakonczenie; return Zyczenia; std::string RdzenNazwyPliku( const std::string &NazwaPliku ) { return NazwaPliku.substr( 0, NazwaPliku.find(. ) ); } int main( ) { std::string Zyczenia = UniwersalneZyczenia( Z okazji spotkania Marsjan, Ziemianin ); cout << Zyczenia << endl; char const Zycz C = Zyczenia.c str(); } Zyczenia = Z okazji pierwszej swiatowej inwazji Marsjan na supermarkety... ; cout << Zycz C << endl;
Ważniejsze metody klasy std::string 3 Tworzenie tablic i łańcuchów znakowych w sensie języka C: c str zwraca łańcuch w sensie języka C, data zwraca łańcuch w postaci tablicy znakowej, copy przekopiowuje do tablicy znakowej zadana ilość znaków. Ekstrahowanie podłańcuchów: substr zwraca podciag (obiekt klasy string), Dostęp do poszczególnych elementów łańcucha: at kontrolowany dostęp do danego znaku.
Ważniejsze metody klasy std::string 4 Rozmiar i wielkość łańcucha: length podaje długość łańcucha w sensie języka C, size podaje rozmiar łańcucha, max size podaje maksymalny możliwy rozmiar łańcucha, empty informuje czy dany łańcuch jest pusty. Pojemność łańcucha i jej zmiana: capacity określenie pojemności, reserve rezerwacja pamięci. Szukanie i porównywanie: find szukania znaków i ciagów znaków, compare porównuje dwa ciagi.
Ważniejsze metody klasy std::string 5 Modyfikacje łańcuchów: assign przypisanie ciagów, append dołaczanie ciagów, insert wstawianie ciagów, replace zamiana podciagów, swap zamiana wartości dwóch łańcuchów, Kasowanie zawartości łańcucha i usuwanie znaków: clear usuwa cała zawartość łańcucha, erase usuwa cały lub wybrany fragment łańcucha. Iteratory: begin, end zwracaja iteratory, rbegin, rend zwracaja iteratory wsteczne.
Przeciażenia operatorów dla std::string 6 Przeciażenia w klasie std::string: <, >, <=, >=, ==,!= porównania, = przypisanie, +, += konkatenacja, [ ] bezpośredni dostęp do znaku bez kontroli zakresu, Przeciażenia zewnętrzne dla klasy std::string: << wyjście na strumień klasy ostream, >> wejście ze strumienia klasy istream. W klasie std::string brak jest konwertera do typu const char.
Metody wyszukiwania znaków i łańcuchów 7 Poniższe metody zwracaja numer pozycji znaku lub ciagu zawartego w danym łańcuchu. W przypadku gdy nie zostanie on znaleziony zwracana jest wartość string::npos. find Szuka pierwszego wystapienia danej wartości. rfind Szuka ostatniego wystapienia danej wartości. find first of Szuka pierwszego wyst apienia znaku będacego częścia danej wartości. find last of Szuka ostatniego wyst find first not of find last not of danej wartości. apienia znaku będacego częścia Szuka ostatniego wystapienia znaku nie będacego częścia danej wartości. Szuka ostatniego wystapienia znaku nie będacego częścia danej wartości.
Metody wyszukiwania znaków i łańcuchów 8 Przeciażenia i typy argumentów dla metod wyszukiwania: size type Metoda(typ argumentu arg ) size type Metoda(typ argumentu arg, size type indeks ) size type Metoda(typ argumentu arg, size type indeks, size type liczba znaków ) typ argumentu = const string& const char const char Przykłady użycia: string str( Czy zielony krokodyl jest bardziej zielony, czy też bardziej długi? ); string wzorzec( lony ); string ::size type idx = 8; str.find first of( lony ) // Tu będzie 2 - pozycja znaku y str.find first not of( Czlony ) // Tu będzie 3 - pozycja znaku str.find(wzorzec) // Tu będzie 7 - pozycja łańcucha lony str.find( lony,idx,1) // Tu będzie 19 - pozycja znaku l str.rfind( lony ) // Tu będzie 39 - pozycja łańcucha lony
Metody dołaczania znaków i łańcuchów Przeciażenia i typy argumentów dla metod dołaczania: 9 string& append( typ argumentu zrodlo ) string& append( const char zrodlo, size type ilosc ) string& append( const string& zrodlo, size type indeks, size type ilosc ) string& append( size type ilosc, char znak ) string& append( Iterator pocz, Iterator koniec ) typ argumentu = [ const string& const char ] Przykłady użycia: string str(... krokodyl ); string kolor( jest zielony ), zakonczenie(?czy tez bardziej dlugi? ); str.append( jest ); //... krokodyl jest str.append( :? bardziej jadowity +3,9); //... krokodyl jest bardziej str.append(kolor,5,kolor.length()-5); //... krokodyl jest bardziej zielony str.push back(, ); str.append(1, ); //... krokodyl jest bardziej zielony, string::iterator pocz = zakonczenie.begin(); string::iterator kon = zakonczenie.end(); cout << str.append(++pocz,kon) << endl; //... krokodyl jest bardziej zielony, czy tez bardziej dlugi?
10 Metody przypisania znaków i łańcuchów Przeciażenia i typy argumentów dla metod przypisania: string& assign( typ argumentu zrodlo ) string& assign( const char zrodlo, size type ilosc ) string& assign( const string& zrodlo, size type indeks, size type ilosc ) string& assign( size type ilosc, char znak ) string& assign( Iterator pocz, Iterator koniec ) typ argumentu = [ const string& const char ] Przykłady użycia: string Pyt( Czy zielony krokodyl... ), Odp( Bardziej zielony... ); Pyt.assign(Pyt.c str(),3); // Pyt = Czy Pyt.assign( Czy zielony krokodyl...,3); // Pyt = Czy Pyt.assign(Odp.c str(),9,30); // Pyt = zielony... Pyt.assign(Odp,9,3); // Pyt = zie Pyt.assign(4, x ); // Pyt = xxxx string ::iterator Pocz = Odp.begin(), Kon = Odp.end(); Pyt.assign(++Pocz,------Kon); // Pyt = ardziej zielony
11 Metody zamiany łańcuchów poczatek koniec zamiennik string& replace( iterator Pocz, iterator Kon, const string& Zam ) string& replace( iterator Pocz, iterator Kon, const char Zam ) Warunki zgłaszania wyjatków: out of range gdy Pocz > Kon length error gdy długość wynikowego łańcucha przekracza maksymalna dopuszczalna długość. Przykłady użycia: string Nap( zielony krokodyl ), Zam( stek ); string::iterator Pocz = Nap.begin(); string::iterator Kon = Nap.end(); Nap.replace(Pocz+8, Kon, Zam); Nap.replace(Nap.begin(), Nap.begin()+5, string( smacz )); // Nap == zielony stek // Nap == smaczny stek Nap.replace(Nap.begin(), Nap.begin()+1, Nie s ) Nap.replace(Nap.end()-4, Nap.end(), ser ); Nap.replace(Nap.end(), Nap.begin(), Zam); // Nap == Nie smaczny stek // Nap == Nie smaczny ser // Tu zgłoszony będzie wyjatek out of range
Metody zamiany łańcuchów 12 indeks długość zamiennik string& replace( size type Ind, size type Dlug const string& Zam ) string& replace( size type Ind, size type Dlug const char Zam ) Warunki zgłaszania wyjatków: out of range gdy i > this >size( ) (indeks jest większy niż rozmiar danego łańcucha znaków) length error gdy długość wynikowego łańcucha przekracza maksymalna dopuszczalna długość. Przykłady użycia: string Nap( zielony krokodyl ), Zam( stek ); Nap.replace(8, Nap.length()-8, Zam); Nap.replace(0, 5, string( smacz )); Nap.replace(0, 1, Nie s ).replace(nap.length(), 4, ser ); Nap.replace(40, 2, Zam); // Nap == zielony stek // Nap == smaczny stek // Nap == Nie smaczny ser //UWAGA: Nap ma wartość sprzed pierwszego wywołania replace. Odwoływanie //się do tego samego obiektu w takim ciagu wywołań metod nie jest zalecane. // Tu zgłoszony będzie wyjatek out of range
Metody zamiany łańcuchów 13 indeks długość zamiennik indeks zam. długość zam. string& replace( size type i, size type d, const string& z, size type j, size type l ) Warunki zgłaszania wyjatków: out of range gdy i > this >size( ) (indeks jest większy niż rozmiar danego łańcucha znaków) out of range gdy j > z.size( ) (indeks dla zamiennika jest większy niż jego rozmiar) length error gdy długość wynikowego łańcucha przekracza maksymalna dopuszczalna długość. Przykłady użycia: string Nap( to bardzo zielony krokodyl ); string Zam( duzy smakowity stek ); Nap.replace(10,7,Zam,5,9); Nap.replace(10,700,Zam,5,1000); Nap.replace(2000,2,Zam,5,2); Nap.replace(5,2,Zam,2000,5); // Nap == to bardzo smakowity krokodyl // Nap == to bardzo smakowity stek // Tu nastapi zgłoszenie wyjatku... //... również w tym przypadku nastapiłoby to.
Metody zamiany łańcuchów 14 indeks długość zamiennik ilość znaków. string& replace( size type Ind, size type Dług, const char Zam, size type Ilość ) string& replace( iterator Pocz, iterator Kon, const char Zam, size type Ilość ) poczatek koniec zamiennik ilość znaków. Warunki zgłaszania wyjatków: out of range gdy Ind > this >size( ) (indeks jest większy niż rozmiar danego łańcucha znaków) out of range gdy Pocz > Kon length error gdy długość wynikowego łańcucha przekracza maksymalna dopuszczalna długość. Przykłady użycia: string const char Nap( to bardzo zielony krokodyl ); C zam = duzy smakowity stek ); Nap.replace(10,7,C zam,5,9); // Nap == to bardzo smakowity krokodyl Nap.replace(Nap.begin()+10,Nap.end(),C zam+5,strlen(c zam)-5); // Nap == to bardzo smakowity stek Nap.replace(5,2,C zam,5,5000); Nap.replace(2000,2,C zam+5,2); // Teraz będzie mnóstwo śmieci. // Tu nastapi zgłoszenie wyjatku...
Metody zamiany łańcuchów 15 indeks długość wielokrotność string& replace( size type Ind, size type Dług, size type Ilość, char Znak ) string& replace( iterator Pocz, iterator Kon, size type Ilość, char Znak ) poczatek koniec wielokrotność Warunki zgłaszania wyjatków: out of range gdy Ind > this >size( ) (indeks jest większy niż rozmiar danego łańcucha znaków) out of range gdy Pocz > Kon length error gdy długość wynikowego łańcucha przekracza maksymalna dopuszczalna długość. Przykłady użycia: string Nap( to bardzo zielony krokodyl ); Nap.replace(10,7,4,. ); // Nap == to bardzo.... krokodyl Nap.replace(Nap.end()-8,Nap.end(),10,? ); // Nap == to bardzo....?????????? Nap.replace(2000,2,C zam+5,2); // Tu nastapi zgłoszenie wyjatku...