13.1 Standardowa biblioteka C++... 1 13.2 Klasa string... 3 13.1 Standardowa biblioteka C++ C++ Standard Library - Standardowa biblioteka C++, jest element standardu ISO/IEC 14882, Programming languages C++. Standardową bibliotekę C++ tworzą funkcje zadeklarowane w 32 standardowych plikach nagłówkowych, 2 dodatkowych plikach <hash_map>, <hash_set>, 18 plikach nagłówkowych standardowej biblioteki języka C. Pliki nagłówkowe standardowej biblioteki języka C++. <algorithm> <bitset> <complex> <deque> <exception> <fstream> <functional> <hash_map> <hash_set> <iomanip> <ios> <iosfwd> <iostream> <istream> <iterator> <limits> <list> <locale> <map> <memory> <new> <numeric> <ostream> <queue> <set> <sstream> <stack> <stdexcept> <streambuf> <string> <strstream> <utility> <valarray> <vector> 18 plików nagłówkowych standardowej biblioteki języka C. <cassert> <cctype> <cerrno> <cfloat> <ciso646> <climits> <clocale> <cmath> <csetjmp> <csignal> <cstdarg> <cstddef> <cstdio> <cstdlib> <cstring> <ctime> <cwchar> <cwctype> 1
Standardowa biblioteka C++ napisana jest dwóch konwencjach: konwencja biblioteki iostreams, konwencja biblioteki STL (Standard Template Library). Komponenty standardowej biblioteki C++: biblioteka wsparcia języka (Language Support). Biblioteka zawiera np. elementy określające granice implementacji (<climits>, <cfloat>),funkcje dynamicznej alokacji pamięci ( <new>). biblioteka obsługi wyjątków (Diagnostics Library) W pliku nagłówkowym <exception> zadeklarowane są klasy obsługi wyjątków, w <cassert> funkcja debugowania. biblioteka narzędzi ogólnych (General Utilities Library). Elementy biblioteki uŝywane przez inne komponenty Biblioteki Standardowej C++, np. szablony operatorów!=, >, <=, >=, zbiór obiektów funkcyjnych (function objects) dla biblioteki STL. biblioteka obsługi języków narodowych (Localization Library). Obsługa róŝnych formatów liczb, daty, czasu, waluty, innych. klasa bit_string, zawiera operacje na tablicach bitowych biblioteka kontenerów (Containers Library). Element biblioteki STL. biblioteka iteratorów (Iterators Library). Element biblioteki STL. biblioteka algorytmów (Algorithms Library). Element biblioteki STL. biblioteka operacji numerycznych (Numerics Library). 2
13.2 Klasa string Klasa string jest elementem, konwencji biblioteki iostreams. Wybrane metody klasy String. Clone() Zwraca referencję do danego stringu. Compare() Concat() Contains() Copy() Equals GetHashCode() Insert() Remove() Replace() Porównuje stringi. Metoda przeładowana Łączy stringi. Metoda przeładowana. Zwraca wartość wskazująca, czy określony podstring zawiera się w stringu. Tworzy instancję stringu, z tą samą wartością. Określa czy dwa stringi mają taką samą wartość. Metoda przeładowana. Zwraca hash code stringu. Metoda nadpisuje Object..::.GetHashCode()()(). Wstawia string do określonego miejsca w innym stringu. Usuwa okresloną liczbę znaków ze stringu. Metoda przeładowana. Zamienia dany znak występujący w stringu na inny. Metoda przeładowana Wybrane rozszerzenia metod klasy String. First() Last() Max() Min() Reverse() Odwraca kolejność znaków w stringu. Operatory klasy String. Equality Określa czy dwa stringi mają taką samą wartość. Inequality Określa czy dwa stringi mają róŝną wartość. Pola klasy String. Empty Pusty string. Pole typu read-only. Property klasy String. Chars Pobiera znak z określonego miejsca w stringu. Length Pobiera liczbę znaków w stringu. 3
Przykład 1. Operacje na stringach. Operacje na tablicach znaków (w13-01-string-c-style.cpp). Metoda: size(). string strtekst1("abc"); // klasa string const char * pcc ="123cdefg"; // styl C strtekst1 = strtekst1 + pcc; cout <<"strtekst= " << strtekst1 << endl; // odwrotne przyporzdkowanie // pcc = strtekst1; // blad, C2679 pcc = strtekst1.c_str(); //ok cout <<"pcc= " << pcc << endl; // dlugosc stringu int iwielkosc; iwielkosc = strtekst1.size(); cout <<"iwielkosc= " << iwielkosc << endl; // styl C, strlen() cout <<"strlen(pcc)= " << strlen(pcc) << endl; // dostep do znaku for(unsigned int i=0; i<strtekst1.size(); i++) if(strtekst1[i]=='b') cout << strtekst1[i] <<endl; // definicja tablicy znaków char * new_ctab = new char[strlen(pcc)+1]; strcpy_s(new_ctab,strlen(pcc)+1, pcc); cout <<"new_ctab= " << new_ctab << endl; delete [] new_ctab; 4
Przykład 2. Operacja na stringach dodawanie stringów (w13-02-string-dodawanie.cpp). string s1, s2; string s3 = "Dzien"; string s4("+ do "); s2 = "+ bry"; s1 = s3 + " " + s4; s1 += " + *** "; cout << s1 + s2 + "!" << endl; 5
Przykład 3. Operacje na stringach (w13-03-string-compare-append.cpp). Metody: length() compare() append() insert() erase() string str1("dzien Dobry"), str2(str1), str3; str3 = str1; str2 = "ABCD efgh"; // inicjalizacja zmiennej typu char const * za pomoca funkcji c_str() char const * c = str2.c_str(); cout << * c <<endl; unsigned int i = str1.size(); cout << i <<endl; i = str1.length(); cout << i <<endl; // metoda compare() int x; x = str1.compare(str2); cout << "str1.compare(str2)= " << x << endl; x = str2.compare(str1); cout << "str2.compare(str1)= " << x << endl; x = str1.compare(str1); cout << "str1.compare(str1)= " << x << endl << endl; // metoda append() str1.append(", jest 8.00."); cout << "str1= " << str1 << endl; // metoda insert() str1.insert(i+7, " godz. "); cout << "str1= " << str1 << endl; // metoda erase(int from, int to) cout << str1.erase(5, 9) << endl; 6
Przykład 4. Operacje na stringach (w13-04-string-find-substr.cpp). Metody: find() substr() void main () int ipozycja; string szrodlo("abcdefghijkl"); string s1("ghi"); //metoda find() ipozycja = szrodlo.find(s1); cout <<"String: " << s1 << " zaczyna sie od bajtu: "<< ipozycja << endl; string s2("ghj"); ipozycja = szrodlo.find(s2); if(!ipozycja) cout << "String: "<< s2 << " zaczyna sie od bajtu: " << ipozycja << endl; cout<<"nie znaleziono stringu: " << s2 << endl; int start = 2; int size = 3; string sszukany; //metoda substr(int start, int size) sszukany = szrodlo.substr(start, size); cout << "3 bajtowy string po 2 bajcie to: "<< sszukany << endl; Przykład 5. Program kopiuje dane tekstowe z pliku do pliku (w13-05-stringzplikudopliku.cpp). JeŜeli nie ma pliku do zapisu, to jest tworzony. #include <fstream> ifstream in("zpliku.txt"); ofstream out("dopliku.txt"); string s; while(getline(in, s)) out << s << "\n"; 7
Przykład 6. Program kopiuje dane z pliku do pliku numerując linie (w13-06-stringzplikudoplikuznumeremlinii.cpp). JeŜeli nie ma pliku do zapisu, to jest tworzony. #include <fstream> #include <vector> vector<string> v; ifstream in("zpliku.txt"); ofstream out("dopliku.txt"); string line; while(getline(in, line)) v.push_back(line); for(unsigned int i = 0; i < v.size(); i++) out << i << ": " << v[i] << "\n"; cout << i << ": " << v[i] << endl; 8
Przykład 7. Operacje na stringach, metoda lexicographical_compare(), (w13-07-stringcomp.cpp). Metody: lexicographical_compare() begin() end() #include <algorithm> string s1 = "abcd"; string s2 = "abd"; if (lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end())) cout << s1 << " < " << s2 << endl; cout << s1 << " >= " << s2 << endl; s2 = "abc"; if (lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end())) cout << s1 << " < " << s2 << endl; cout << s1 << " >= " << s2 << endl; s2 = "abcd"; if (lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end())) cout << s1 << " < " << s2 << endl; cout << s1 << " >= " << s2 << endl; 9
Przykład 8. Operajce na stringach. Porównanie stringów (w13-08-stringpermutacje.cpp). int PorownajStringi(const string& s1, const string& s2) string::const_iterator p1 = s1.begin(), p2 = s2.begin(); while(p1!= s1.end() && p2!= s2.end()) if(toupper(*p1)!= toupper(*p2)) return (toupper(*p1)<toupper(*p2))? -1 : 1; p1++; p2++; return(s2.size() - s1.size()); string s1("czerowny"); string s2("zielony"); string s3("niebieski"); string s4("zielony"); cout << PorownajStringi(s1, s2) << endl; cout << PorownajStringi(s2, s3) << endl; cout << PorownajStringi(s2, s4) << endl; 10
Przykład 9. Operacje na stringach (w13-09-string-partition.cpp). Metody: begin() end() prev_permutation(first, Last), zmienia uporządkowanie znaków od znaku First do Last. Metoda porównuje uporządkowanie stringu z uporządkowaniem alfabetycznym. Metoda zwraca wartość true, gdy zmieni uporządkowanie znaków. JeŜeli permutacji nie było zwraca wartość false. next_permutation(first, Last), zmienia uporządkowanie znaków na uporządkowanie alfabetyczne. #include <algorithm> string s = "abdc"; // sting z permutcją // string s = "abcd"; // sting uprządkowany alfabetycznie cout << "s = " << s << endl; // previous lexicographic permutation if (prev_permutation(s.begin(), s.end())) cout << "s = " << s << endl; cout << "brak poprzedniej permutacji: s = " << s << endl; if (prev_permutation(s.begin(), s.end())) cout << "s = " << s << endl; cout << "brak poprzedniej permutacji: s = " << s << endl; if (next_permutation(s.begin(), s.end())) cout << "s = " << s << endl; cout << "brak nastepnej permutacji: s = " << s << endl; if (next_permutation(s.begin(), s.end())) cout << "s = " << s << endl; cout << "brak nastepnej permutacji: s = " << s << endl; 11
Przykład 10. Operacje na stringach, metoda partition(), (w13-10-porownajstringi.cpp). Metody: partition() algorytm ustawia elementy, które spełniają podany warunek, przed elementami, które go nie spełniają. Metoda zwraca iterator przed pierwszym elementem który nie spełnił podanego warunku template <class ForwardIterator, class Predicate> ForwardIterator partition( ForwardIterator first, ForwardIterator last, Predicate pred ); bind1st() funkcja szablonowa która tworzy adapter do konwersji dwuargumentowych obiektów funkcyjnych (binary function object) na jednoargumentowe obiekty funkcyjne (unary function object) poprzez zastapienie pierwszego obiektu wartością Adapert funkcyjny to adaper zwracający obiekt funkcyjny. Parametry bind1st(): _Func - dwuargumentowy obiekt funkcyjny który ma być przekonwertowany. _Left - Wartość z którą będzie pierwszy argument dwuargumentowego obiektu funkcyjnego będzie przypisany. template<typename F> binder1st<f> bind1st(f op, typename F::first_argument_type val) return binder1st<f>(op,val); #include <functional> #include <algorithm> string s = "abcdefgh"; partition(s.begin(), s.end(), bind1st(greater<char>(), 'd')); cout << "s = " << s << endl; 12
Przykład 11. Prosty obiekt funkcyjny (function object), (w13-11-obiektyfunkcyjne.cpp). Przeładowanie operatora ( ). class A public: double operator()(double); double f(double); ; double A:: operator()(double x) // przeładowanie opertora ( ) return f(x); double A:: f(double x) x = x*x; return x; A a; cout << a(3.14) << endl; 13