Klasa std::string. Bogdan Kreczmer. ZPCiR IIAiR PWr pokój 307 budynek C3.

Podobne dokumenty
Wyliczanie wyrażenia obiekty tymczasowe

Szablon klasy std::vector

Referencje do zmiennych i obiektów

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

Wprowadzenie do szablonów szablony funkcji

Podstawy Programowania

Operacje wejścia/wyjścia (odsłona druga) - pliki

Szablon klasy std::list

Wprowadzenie do szablonów szablony funkcji

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Pola i metody statyczne

Operacje wejścia/wyjścia odsłona pierwsza

Konstruktor kopiujacy

Zaawansowane programowanie w języku C++ Biblioteka standardowa

STL: Lekcja 1&2. Filozofia STL

dr inż. Jarosław Forenc

BIBLIOTEKA STANDARDOWA C++

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Język C++ wykład VIII

Geneza powstania języka C++

Opus Magnum C++11 : programowanie w języku C++. T. 2 / Jerzy Grębosz. Gliwice, cop Spis treści

Podstawy programowania w języku C++

Symfonia C++ standard : programowanie w języku C++ orientowane obiektowo. T. 1 / Jerzy Grębosz. Wyd. 3 C - popr. Kraków, 2015.

Języki programowania obiektowego Nieobiektowe elementy języka C++

Geneza powstania języka C++

Programowanie i struktury danych

Lista dwukierunkowa - przykład implementacji destruktorów

Szablony funkcji i szablony klas

PARADYGMATY PROGRAMOWANIA Wykład 3

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Informatyka 1. Przetwarzanie tekstów

Łańcuchy znakowe string

Podstawy programowania

Wprowadzenie do szablonów klas

Przesłanianie nazw, przestrzenie nazw

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Operatory na rzecz typu TString

Klasa, metody, rozwijanie w linii

Obiekty i metody stałe

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Klasa, metody, rozwijanie w linii

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Programowanie w języku C++

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

#include <iostream> #include <string> using namespace std; auto main() -> int { string s1; // pusty string. Klasa std::string

Podstawy programowania skrót z wykładów:

Rzutowanie i konwersje

Języki i techniki programowania Ćwiczenia 2

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Wykład 2 Składnia języka C# (cz. 1)

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

Programowanie komputerowe. Zajęcia 5

Aplikacja po polsku. Bogdan Kreczmer. ZPCiR ICT PWr pokój 307 budynek C3.

Język C++ Różnice między C a C++

Style programowania - krótki przeglad

Programowanie i struktury danych. Wykład 4 Dr Piotr Cybula

Podstawy programowania w języku C++

Programowanie Obiektowew języku C++ Zadania L4

Qt - edycja, obsługa zdarzeń, rozmieszczenie kontrolek

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Podstawy programowania w języku C++

Operator przypisania. Jest czym innym niż konstruktor kopiujący!

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Zadania z podstaw programowania obiektowego

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

Algorytmy i Struktury Danych. Anna Paszyńska

Programowanie w językach

Programowanie 2. Język C++. Wykład 3.

Oracle PL/SQL. Paweł Rajba.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Zajęcia 4 procedury i funkcje

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Jak Windows zarządza pamięcią?

Wykład 3 Składnia języka C# (cz. 2)

Informatyka I. Wykład 4. Tablice. Dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Szablony klas, zastosowanie szablonów w programach

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Podejście obiektowe - podstawowe pojęcia

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

ŁAŃCUCHY W JĘZYKU C/C++

Programowanie Obiektowe i C++


Transkrypt:

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...