vector

Transkrypt

vector
Programowanie obiektowe
Wykład 12
Dariusz Wardowski
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
1/19
Programowanie obiektowe
Wykład 12
Klasa string
Klasa string umieszczona w standardowej bibliotece odpowiada za różnego rodzaju operacje
na łaocuchach.
string
string
string
string
string
string
s0; //łańcuch o długości 0
s1(„Ala ma kota”);
s2(10,’x’); //utworzy łańcuch „xxxxxxxxxx”
s3(„Nie lubie C++”,4,9); //”lubie C++”
s4(„Ciekawy wyklad?”,14); //”Ciekawy wyklad”
s5(&s4[0],&s4[5]); //”Ciek”
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
2/19
Programowanie obiektowe
Wykład 12
Operatory
+
cout << string(„Ala”) + string(„ ma”) + string(„ kota”);
cout << s1 + s3;
=
s2 = s3;
s4 = ’d’;
[]
string s(„Tekst”);
cout << s[2]; // ‘k’
<, ==, !=
string t1(„abc”);
string t2(„abd”);
cout << (t1 < t2) << (t1 == t2) << (t1 != t2) << endl;
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
3/19
Programowanie obiektowe
Wykład 12
length() i size()
Za pomocą tych metod odczytujemy długośd łaocucha.
string s(„baaaaaaaaaaaaaaaaaardzo dlugi string”);
cout << s.size() << endl;
cout << s.length() << endl;
Obydwie funkcje zwracają długośd łaocucha bez znaku kooca.
Funkcja length() pochodzi ze starszych wersji klasy string, natomiast funkcja size()
zgodna jest z biblioteką STL.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
4/19
Programowanie obiektowe
Wykład 12
STL (Standard Template Library)
STL to biblioteka szablonów zawierająca:
kontenery – pełniące rolę analogiczną do tablic, czyli przechowują obiekty tego samego typu
iteratory – obiekty umożliwiające przeglądanie elementów w kontenerze
obiekty funkcyjne – działaniem przypominające funkcje, inaczej funktory, mogą byd obiektami
klas lub wskaźnikami do funkcji.
algorytmy – czyli grupa instrukcji wykonująca określone zadanie.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
5/19
Programowanie obiektowe
Wykład 12
vector
vector to klasa szablonowa, której obiekty pozwalają na przechowywanie obiektów tego
samego typu. Alokacja pamięci następuje w sposób dynamiczny.
#include <vector>
int main()
{
vector<double> liczby(10);
for (int i=0; i<10; i++)
liczby[i]=i*i;
return 0;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
6/19
Programowanie obiektowe
Wykład 12
Iterator klas kontenerowych
Każda klasa kontenerowa posiada iterator, czyli mechanizm, który przypomina działanie
wskaźnika. W szczególności iterator może byd wskaźnikiem, lecz również może byd obiektem dla
którego zdefiniowano odpowiednie metody pozwalające działad jak wskaźnik.
vector<double> liczby(10);
for (int i=0; i<10; i++)
liczby[i]=i*i;
vector<double>::iterator it; //definicja iteratora
it = liczby.begin(); //ustawienie iteratora na pierwszy element
for (int i=0; i<liczby.size(); i++) //określenie wielkości
// konteneru
{
cout << *it << endl; //operator wyłuskania
it++; //iterator wskazuje na nastepny element
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
7/19
Programowanie obiektowe
Wykład 12
begin() i end()
Metoda begin() zwraca iterator wskazujący na pierwszy element kontenera.
Metoda end() zwraca iterator wskazujący na element, który znajduje się za ostatnim
elementem kontenera, element ten nazywany jest elementem ograniczającym.
it = liczby.begin();
while (it != liczby.end())
{
cout << *it << endl;
it++;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
8/19
Programowanie obiektowe
Wykład 12
push_back
Jest to jedna z metod, która należy tylko do niektórych klas kontenerowych (np. do vector).
Metoda ta umożliwia dodanie elementu na koniec konteneru.
vector<char> znaki; //tworzy pusty wektor
char z;
while (cin >> z && z!=‘a’)
znaki.push_back(z);
for (int i=0; i < znaki.size(); i++)
cout << znaki[i];
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
9/19
Programowanie obiektowe
Wykład 12
erase
Metoda erase powoduje usunięcie elementów kontenera. Usuwane elementy wskazywane są
przez iteratory będące argumentami.
vector<bool> taknie(4);
taknie[0]=taknie[2] = false;
taknie[1]=taknie[3] = true;
taknie.erase(taknie.begin()++, taknie.begin()+2);
for (int i=0; i<taknie.size(); i++)
cout << taknie[i] << endl;
erase(it1, it2) usunie elementy kontenera zaczynając od elementu na który wskazuje
it1 aż do elementu występującego przed elementem wskazywanym przez iterator it2;
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
10/19
Programowanie obiektowe
Wykład 12
insert
Dzięki metodzie insert możemy wstawid elementy z jednego kontenera do drugiego.
vector<string> s1;
s1.push_back(„Ala”);
s1.push_back(„ma”);
s1.push_back(„kota”);
vector<string> s2;
s2.push_back(„Janek”);
s2.push_back(„ma”);
s2.push_back(„kota”);
s2.push_back(„i”);
s2.push_back(„psa”);
s1.insert(s1.end(),s2.begin()+3,s2.end());
vector<string>::iterator it;
it = s1.begin();
while (it != s1.end())
{
cout << *it << " ";
it++;
}
cout << endl;
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
11/19
Programowanie obiektowe
Wykład 12
Funkcje biblioteki STL
Bibliotek STL poza klasami szablonowymi, zawiera również funkcje, które nie są związane z żadną
klasą. Jednakże każda klasa z tej biblioteki może tego typu funkcje wykorzystywad.
Poniżej przedstawiono przykładowe funkcje STL-owe, które nie są związane z klasami.
for_each();
random_shuffle();
sort();
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
12/19
Programowanie obiektowe
Wykład 12
random_shuffle
Jest to funkcja dwuargumentowa pobierająca dwa iteratory określające zakres obiektów jakie
mają byd rozmieszczone w sposób losowy.
vector<int> w(10);
for (int i=0; i<10; i++)
w[i] = 5*i;
srand (unsigned(time(NULL)));
random_shuffle(w.begin()+1, w.end());
Powyższy kod spowoduje rozmieszczenie w sposób losowy elementów o wartościach od 5 do 45.
Element 0 (czyli pierwszy) zostanie na swoim miejscu.
random_shuffle może byd zastosowany dla tych kontenerów, dla których możliwy jest
losowy dostęp (operator *+).
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
13/19
Programowanie obiektowe
Wykład 12
sort
Funkcja sort powoduje posortowanie w kolejności rosnącej elementów danego kontenera w
zakresie podanym przez dwa iteratory. Do porównywania elementów używany jest operator <.
vector<int> w(10);
for (int i=0; i<10; i++)
w[i] = 5*i;
sort(w.begin(),w.end());
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
14/19
Programowanie obiektowe
Wykład 12
sort
class A
{
int x;
public:
A() {}
int getx() {return x;}
A(int _x) : x(_x) {}
friend bool operator<
(const A & a1, const A & a2)
{
if (a1.x<a2.x)
return true;
return false;
}
};
int main()
{
vector<A> g(10);
for (int i=0; i<10; i++)
{
g[i] = A(i+10);
}
sort(g.begin(),g.end());
for (int i=0; i<10; i++)
{
cout << g[i].getx() << " ";
}
return 0;
}
W przypadku, gdy kontener zawiera obiekty typu zdefiniowanego przez użytkownika, należy
pamiętad o zdefiniowaniu funkcji operator<().
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
15/19
Programowanie obiektowe
Wykład 12
Więcej kontenerów
Biblioteka STL posiada wiele rodzajów kontenerów. Kontenery te różnią się typami. Poniżej
przedstawiono listę nazw różnych typów kontenerów:
•
•
•
•
•
•
•
•
•
•
•
vector
deque
list
queue
priority_queue
stack
map
multimap
set
multiset
bitset
Wszystkie powyższe typy kontenerów służą do przechowywania obiektów. W ramach jednego
konteneru wszystkie obiekty muszą byd tego samego typu.
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
16/19
Programowanie obiektowe
Wykład 12
Funktory
Funktory, czyli obiekty funkcyjne to dowolne obiekty dla których zdefiniowano operator ().
Poniżej przedstawiono przykład funktora:
class A
{
private:
int x;
public:
A(int _x) : x(_x) {}
int operator()(int y) {return x*y;}
};
A a(10);
int z = a(30); //obiekt a jest funktorem
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
17/19
Programowanie obiektowe
Wykład 12
for_each
Poniżej przedstawiono przykład użycia funktora na przykładzie funkcji for_each.
void f(int & x)
{
x *= 2;
}
int main()
{
vector<int> W;
W.push_back(1);
W.push_back(8);
W.push_back(12);
for_each(W.begin(),W.end(),f);
cout << W[0] << " " << W[1] << " " << W[2] << endl;
return 0;
}
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
18/19
Programowanie obiektowe
Wykład 12
KONIEC
Dziękuję za uwagę 
dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ
19/19