Podstawy informatyki 2012/2013 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
Struktura wektor struct wektor { int n; double *W; void wypisz(); }; void wektor::wypisz() for (int i=0;i<n;i++) cout << W[i] << "\t"; cout << endl; } int main() { wektor X,Y; X.n=2;X.W=new double[2]; X.W[0]=1;X.W[1]=2; X.wypisz(); Y.n=2;Y.W=new double[2]; Y.W[0]=3;Y.W[1]=4; Y.wypisz(); Y=X; Y.W[1]=3; return 0; } 1 2 3 4 1 2 1 2 1 3 1 3
Co powinien robić operator przypisania? Sprawdzić czy nie kopiuje do samego siebie (A=A). Zlikwidować dotychczasowe wnętrze. Zbudować obiekt jeszcze raz na podobieństwo obiektu wzorcowego. Zwracać skopiowany albo wzorcowy obiekt (są takie same).
Operator = wektor &wektor::operator=(const wektor &A) { if (&A==this) return *this; delete [] W; n=A.n; W=new double[n]; for (int i=0;i<n;i++) W[i]=A.W[i]; return *this; }
Struktura wektor struct wektor { int n; double *W; void wypisz(); wektor &operator=(const wektor &A); }; void wektor::wypisz() for (int i=0;i<n;i++) cout << W[i] << "\t"; cout << endl; } int main() { wektor X; X.n=2; X.W=new double[2]; X.W[0]=1; X.W[1]=2; X.wypisz(); wektor Y=X; Y.wypisz(); Y.W[1]=3; return 0; } 1 2 1 2 1 2 1 3 1 3
Struktura wektor wektor Y=X; wywoływany jest nie operator przypisania tylko konstruktor kopiujący!!!
std::string Tablice znaków (C-stringi) nie są typem fundamentalnym. Nie ma więc w C++ operacji na C-stringach. Dlatego powstała klasa string, która zawiera funkcje przydatne przy pracy z ciągami znaków.
Definiowanie - konstruktory string(); string t1; string(const char *); string t2("AGH"); char c[]="WIMiIP”; string t3(c); string t4(&c[1]); string(const char *, size_type); string t5("WIMiIP AGH",6); string(size_type, char); string t6(10,'A'); string(const string &); string t7(t2); string(const string &, size_type, size_type); string t8(t4,1,2);
Definiowanie - konstruktory #include<string> … int main(){ string t1; string t2("AGH"); char c[]="WIMiIP"; string t3(c); string t4(&c[1]); string t5("WIMiIP AGH",6); string t6(8,'A'); string t7(t2); string t8(t4,1,2); } AGH WIMiIP IMiIP WIMiIP AAAAAAAA AGH Mi
Dodawanie string operator+(const string& lhs, const string& rhs); string operator+(const char* lhs, const string& rhs); string operator+(char lhs, const string& rhs); string operator+(const string& lhs, const char* rhs); string operator+(const string& lhs, char rhs);
cout << t4 << endl; return 0; } Operator + int main() { string t1, t2, t3, t4; t1="1 IS"; t2="WIMiIP"; t3="AGH"; t4=t1+"\n"+t2+"\n"+t3; cout << t4 << endl; return 0; } 1 IS WIMiIP AGH
Dodawanie z przypisaniem string& string::operator+=(const string& str); string& string::operator+=(const char* s); string& string::operator+=(char c);
Operator += int main() { string t; for (int i=static_cast<int>('A');i<=static_cast<int>('Z');i++) t+=static_cast<char>(i); cout << t << endl; return 0; } ABCDEFGHIJKLMNOPQRSTUVWXYZ
Długość size_type string::size(); size_type string::length(); int main() { string t="AGH"; cout << t << endl; cout << t.length() << endl; cout << t.size() << endl; return 0; } AGH 3
Pojemność size_type string::capacity(); size_type string::max_size(); bool string::empty(); string tekst; tekst.empty(); tekst.length(); tekst.capacity(); tekst.max_size(); true 15 4 294 967 294
Pojemność int main() { string tekst; cout <<"Dlugosc\tPojemnosc\n"; cout << tekst.length() << "\t"; cout << tekst.capacity() << endl; for (int i=0; i<250; i++) tekst+='A'; if (tekst.length()==tekst.capacity()) } return 0; 0 15 16 31 32 47 48 70 71 105 106 157 158 235 236 352
Rezerwacja pamięci void string::reserve(size_type ile); int main() { string tekst; cout << tekst.length() << "\t"; cout << tekst.capacity() << endl; tekst.reserve(100); if (tekst.empty()) cout << "tekst jest pusty" << endl; return 0; } 0 15 0 111 tekst jest pusty
Zmiana długości ABCDEFGH 8 ABC 3 ABC 10 void string::resize(size_type ile, char znak=‘\0’); int main() { string tekst("ABCDEFGH"); cout << tekst << "\t"; cout << tekst.length() << endl; tekst.resize(3); tekst.resize(10); return 0; } ABCDEFGH 8 ABC 3 ABC 10
Zmiana długości ABCDEFGH 8 ABC 3 ABC....... 10 int main() { string tekst("ABCDEFGH"); cout << tekst << "\t"; cout << tekst.length() << endl; tekst.resize(3); tekst.resize(10,'.'); return 0; } ABCDEFGH 8 ABC 3 ABC....... 10
reserve vs resize int main() { string tekst("ABCDEFGH"); cout << tekst.length() << "\t"; cout << tekst.capacity() << endl; tekst.resize(3); tekst.resize(10); return 0; } 8 15 3 15 10 15
[] oraz at char &string::operator[](size_type pozycja); char &string::at(size_type pozycja); int main() { string tekst("AGH"); cout << tekst[1] << endl; cout << tekst.at(1) << endl; return 0; } G
[] vs at string tekst("AGH"); cout << tekst[4] << endl; cout << tekst.at(4) << endl;
[] vs at Wartość spoza stringu #include <iostream> #include<string> #include<stdexcept> using namespace std; int main() { string tekst("AGH"); try cout << tekst.at(4) << endl; } catch(out_of_range) cout << "Wartosc spoza stringu" << endl; return 0; Wartość spoza stringu
substr string string::substr(size_type pozycja, size_type ile); int main() { string tekst1("AGH WIMiIP"), tekst2; tekst2=tekst1.substr(4,6); cout << tekst1 << endl; cout << tekst2 << endl; return 0; } AGH WIMiIP WIMiIP
Wyszukiwanie size_type string::find(const char* co, size_type odkad=0); size_type string::find(const string & co, size_type odkad=0);, size_type string::find(const char* co, size_type odkad, size_type dlugosc); size_type string::find(char co, size_type odkad=0);
find int main() { string tekst1("AGH WIMiIP AGH"), tekst2("AGH"); string::size_type poz1,poz2; cout << tekst1 << endl; cout << tekst2 << endl; poz1=tekst1.find(tekst2); cout << poz1 << endl; poz2=tekst1.find(tekst2,poz1+1); cout << poz2 << endl; return 0; } AGH WIMiIP AGH AGH 11
Co jeśli nie ma? int main() { string tekst1("AGH"), tekst2("UJ"); string::size_type poz; poz=tekst1.find(tekst2); if (poz==string::npos) cout<<"Nie znalazlem\n"; else cout<<"Znalazlem\n"; return 0; } Nie znalazłem
find int main() { string tekst1("ABCDEF"); string::size_type poz1; cout << tekst1 << endl; poz1=tekst1.find("BCE"); cout << poz1 << endl; return 0; } 4 294 967 295
find int main() { string tekst1("ABCDEF"); string::size_type poz1; cout << tekst1 << endl; poz1=tekst1.find("BCE",0,2); cout << poz1 << endl; return 0; } 1
Wyszukiwanie size_type string::rfind(const char* co, size_type odkad=npos); size_type string::rfind(const string & co, size_type odkad=npos);, size_type string::rfind(const char* co, size_type odkad, size_type dlugosc); size_type string::rfind(char co, size_type odkad=npos);
find vs rfind AGH WIMiIP AGH AGH 11 int main() { string tekst1("AGH WIMiIP AGH"), tekst2("AGH"); string::size_type poz_p,poz_k; poz_p=tekst1.find(tekst2); poz_k=tekst1.rfind(tekst2); cout << tekst1 << endl; cout << tekst2 << endl; cout << poz_p << endl; cout << poz_k << endl; return 0; } AGH WIMiIP AGH AGH 11
Wyszukiwanie size_type string::find_first_of( ); size_type string::find_last_of( ); size_type string::find_first_not_of( ); size_type string::find_last_not_of( ); Każda z funkcji przyjmuje takie same zestawy argumentów jak funkcje find i rfind!
find_..._... abcdefghij aeiouy 8 1 9 int main() { string tekst("abcdefghij"), samogloski("aeiouy"); string::size_type poz1,poz2,poz3,poz4; poz1=tekst.find_first_of(samogloski); poz2=tekst.find_last_of(samogloski); poz3=tekst.find_first_not_of(samogloski); poz4=tekst.find_last_not_of(samogloski); cout << tekst << endl; cout << samogloski << endl; cout << poz1 << endl << poz2 << endl; cout << poz3 << endl << poz4 << endl; return 0; } abcdefghij aeiouy 8 1 9
erase oraz clear AGH WIMiIP AGH AGH AGH AGH string &string::erase(size_type od=0, size_type do=npos); void string::clear(); int main() { string tekst("AGH WIMiIP AGH"); cout << tekst << endl; tekst.erase(4,6); tekst.erase(3); tekst.clear(); return 0; } AGH WIMiIP AGH AGH AGH AGH
Wstawianie string &string::insert(size_type gdzie, const string &co); string &string::insert(size_type gdzie, const string &co, size_type odkad, size_type ile); string &string::insert(size_type gdzie, const char *co); string &string::insert(size_type gdzie, const char *co, size_type ile); string &string::insert(size_type gdzie, size_type ile, char co);
insert int main() { string tekst("AGH WIMiIP AGH"); cout << tekst << endl; tekst.erase(4,6); tekst.insert(4,"WIMiIP"); return 0; } AGH WIMiIP AGH AGH AGH AGH WIMiIP AGH
Zastępowanie string &string::replace(size_type odkad, size_type ile, const string &czym); string &string::replace(size_type odkad, size_type ile, const string &czym, size_type odkad_brac, size_type ile_brac); string &string::replace(size_type odkad, size_type ile, const char *czym); string &string::replace(size_type odkad, size_type ile, const char *czym, size_type ile_brac); string &string::replace(size_type odkad, size_type ile, size_type ile_znakow, char znak);
replace int main() { string tekst("AGH WIMiIP"); cout << tekst << endl; tekst.replace(4,6,"WEAIiE"); return 0; } AGH WIMiIP AGH WEAIiE
replace int main() { string tekst("1234567890"); cout << tekst << endl; tekst.replace(4,4,"abc",0,2); return 0; } 1234567890 1234ab90
Zmiana string na C-string const char *string::c_str();
Operatory porównania bool operator==( const string& lhs, const string& rhs ); bool operator==( const char* lhs, const string& rhs ); bool operator==( const string& lhs, const char* rhs ); Analogicznie przeładowane są operatory: != < > >= <=
Porównywanie int main() { string t[2]={"IMiIP","EAIiE"}; cout << (t[0]<t[1]) << endl; cout << (t[0]>t[1]) << endl; return 0; } 1
Porównywanie int string::compare(const string& str) const; int string::compare(const char* s) const; int string::compare(size_type pos1, size_type n1, const string& str) const; int string::compare(size_type pos1, size_type n1, const char* s) const; int string::compare(size_type pos1, size_type n1, const string& str, size_type pos2, size_type n2) const; int string::compare(size_type pos1, size_type n1, const char* s, size_type n2) const;
Porównywanie int main() { string t[2]={"IMiIP","EAIiE"}; cout << (t[0].compare(t[1])) << endl; cout << (t[0].compare(t[0])) << endl; cout << (t[1].compare(t[0])) << endl; return 0; } 1 -1
Porównywanie int main() { string t1("AB CD"),t2("CD AB"); cout<<t1.compare(t2)<<endl; cout<<t1.compare(3,2,t2)<<endl; cout<<t1.compare(3,2,"CD")<<endl; cout<<t1.compare(3,2,t2,0,2)<<endl; cout<<t1.compare(3,2,"CD",1)<<endl; return 0; } -1 AB CD CD AB -1 CD CD AB CD CD 1 CD C
swap void swap(string& lhs, string& rhs); void string::swap(string& str); int main() { string t[2]={"IMiIP","EAIiE"}; cout<<t[0]<<"\t"<<t[1]<<endl; t[0].swap(t[1]); swap(t[0],t[1]); return 0; } IMiIP EAIiE EAIiE IMiIP IMiIP EAIiE
int main() { int a,b; cin>>a; cout<<a<<endl; cin>>b; cout<<b<<endl; return 0; } 1 2 1 2
int main() { string t1,t2; cin>>t1; cout<<t1<<endl; cin>>t2; cout<<t2<<endl; return 0; } AGH WIMiIP AGH WIMiIP
getline istream& getline(istream& is, string& str); int main() { string t; getline(cin,t); cout << t << endl; return 0; } AGH WIMiIP AGH WIMiIP
getline istream& getline(istream& is, string& str, char delim); int main() { string t; getline(cin,t,'.'); cout << t << endl; return 0; } Ala ma kota. To kot Ali. Ala ma kota
Iterator iterator string::begin(); iterator string::end(); int main() { string tekst("AGH"); string::iterator i,j; i=tekst.begin(); j=tekst.end(); cout<<j-i<<endl; return 0; } 3
Iterator int main() { string tekst("AGH"); string::iterator it; it=tekst.begin(); for (int j=0; j<tekst.length(); j++, it++) cout<<*it; cout<<endl; return 0; } AGH
Iterator int main() { string tekst("AGH"); string::iterator i,j; i=tekst.begin(); j=tekst.end(); while (i!=j) cout<<*i; i++; } cout<<endl; return 0; AGH
Iterator int main() { string tekst("0123456789"); string::iterator i,j; i=tekst.begin(); j=tekst.end(); while (i<j) cout<<*i; i+=2; } cout<<endl; return 0; 02468
Iterator do stałego obiektu int main() { const string tekst("0123456789"); string::const_iterator i; i=tekst.begin(); return 0; }
Stały iterator int main() { string tekst("0123456789"); const string::iterator i=tekst.begin(); return 0; }
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl