Szablon klasy std::vector Bogdan Kreczmer ZPCiR IIAiR PWr pokój 307 budynek C3 bogdan.kreczmer@pwr.wroc.pl Copyright c 2006 2010 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.
Szablon klasy standardowej vector int main( ) { std::vector<float> W1; W1[0] = 0; W1.at(0) = 0; // To jest bład. W1 jest pusty // Tu wygenerowany zostanie wyjatek. W1.push back(0); W1[0] = 5; W1.at(0) = 6; // Teraz jest już dobrze. // Tu również jest dobrze. std::vector<float> W2(3); // Deklaracja wektora o rozmiarze 3. W1[0] = 0; W1.at(0) = 0; // Tu jest dobrze, gdyż pierwszy element istnieje. // To także jest poprawne. std::vector<float> const W3(4); // Deklaracja wektora o rozmiarze 4. float zm = W3[0]; // Podwójne przeciażenie operatora indeksujacego // pozwala na stosowanie go do obiektów stałych W3[0] = W3.at(0) = zm; // Bład gdyż jest to stały obiekt. } Szablon klasy std::vector 1
Szablon klasy standardowej vector vec.front( ) zwraca pierwszy element, vec.back( ) zwraca ostatni element, vec[ i ] zwraca i-ty element (zakres nie jest sprawdzany), vec.at( i ) zwraca i-ty element (zakres jest sprawdzany, w przypadku błędu zgłaszany jest wyjatek out of range), vec.push back(e) dodaje na koniec kopie elementu e (może powodować realokację pamięci), vec.pop back( ) usuwa ostatni element i nie zwraca go (może powodować realokację pamięci), vec.size( ) zwraca aktualna liczbę elementów, vec.max size( ) zwraca największa możliwa ilość elementów jaka można zaalokować, vec.capacity( ) zwraca największa możliwa ilość elementów bez realokacji, vec.reserve( ) zwiększa pojemność jeśli nie jest wystarczajaca. Szablon klasy std::vector 2
Szablon klasy standardowej vector vec.begin( ) zwraca iterator wskazujacy na pierwszy element, vec.end( ) zwraca iterator wskazujacy na pozycję za ostatnim elementem, vec.rbegin( ) zwraca iterator dla iteracji odwrotnej wskazujacy na ostatni element, vec.rend( ) zwraca iterator dla iteracji odwrotnej wskazujacy na pozycję przed pierwszym elementem, std::vector<float> V1(6); float zm; for (int i=0; i < V1.size(); i++) V1[i] = 13; for (std::vector<float>::iterator iter = V1.begin(); iter!= V1.end(); ++iter) iter = 13; Szablon klasy std::vector 3
Przykład wykorzystania wzorca std::vector class Wektor f3: public std::vector<float> { float & x, & y, & z; public: float x() const { return x; } float &x() { return x; }... float operator () (int i) const { return std::vector<float>::at(i); } float &operator () (int i) { return this ->std::vector<float>::at(i); } float operator [ ] (int i) const { return std::vector<float>::operator[ ](i); } float &operator [ ] (int i) { return this ->std::vector<float>::operator[ ](i); }... Wektor f3(): std::vector<float>(3), x(this ->std::vector<float>::operator[ ](0)), y(this ->std::vector<float>::operator[ ](1)), z(this ->std::vector<float>::operator[ ](2)) { } }; // Inicjalizacja dla std::vector // Inicjalizacja kolejnych referencji Szablon klasy std::vector 4
Wektor jako tablica #include <iostream> #include <vector> using namespace std; int main() { vector<double> Tab1(20), Tab2(Tab1.size()), Tab3(Tab1.size()); for (int i = 0; i < Tab1.size(); ++i) Tab1[i] = Tab2[i] = Tab3[i] = 4; Tab3.front() = Tab3.back() = 5; Tab3.at(4) = 5; // Podstawienie do pierwszego i ostatniego elementu. // Dostęp z kontrola zasięgu. if (Tab1 == Tab2) { cout << "Te tablice sa równe." << endl; } if (Tab2 < Tab3) { cout << "Ta nierówność jest spełniona." << endl;} return 0; } Szablon std::vector dostarcza udogodnienia, które moga być bardzo użyteczne w przypadku jego stosowania jako tablicy (dostęp z kontrola zakresu, pamiętanie rozmiaru, przeciażone operatory: ==, <, > itp). Szablon klasy std::vector 5
Pytania i ćwiczenia 1. Dany jest fragment kodu: vector<double> Tab(5); double &Zm = Tab[1]; Tab.push back(10); Zm = Tab[5]; (a) Czy prawda jest, że Zm == 10? (b) Czy działanie tego fragmentu kodu może spowodować bład w programie? Uzasadnij odpowiedź. 2. Dany jest fragment kodu: vector<double> Tab1(5), Tab2(7); for (int i=0; i < Tab1.size(); ++i) Tab1[i] = 0; for (int i=0; i < Tab2.size(); ++i) Tab1[i] = 0; (a) Jaki będzie wynik operacji Tab1 == Tab2? (b) Czy zależy on od wartości elementów tych tablic? Szablon klasy std::vector 6