Atom

2009
30
lip

Boost – Array

Kategoria: Boost, C++, Programowanie, TechblogMatthew @ 00:31

Dzisiaj trochę inny temat, a mianowicie Boost. Czym jest Boost chyba nie muszę tłumaczyć, a Ci którzy nie wiedzą niech zajrzą tutaj. Na początek coś prostego: biblioteka Array.

Biblioteka Array wchodzi w skład TR1, jest kontenerem (takim jak vector), który (w przeciwieństwie do vector) ma za zadanie trzymać tablicę o stałym rozmiarze. Można ją inicjalizować jak zwykłą tablicę, nieinicjalizowana będzie posiadała „śmieciowe” wartości. Jeżeli przy inicjalizacji podamy mniej wartości niż rozmiar naszej tablicy, to pozostałe elementy zostaną wypełnione wartościami dymyślnymi:

1
2
3
4
#include <boost /array.hpp>

boost::array<int , 5> a = {1, 2, 3};
boost::array</int><int , 5> b;

A teraz jakie możliwości dostarcza nam klasa Array. Oczywiście są to iteratory, zarówno „normalne” jak i odwrotne:

1
2
cout < < *(a.begin()) << endl; // iterator dla pierwszego elementu
cout << *(a.rend() - 1) << endl; // odwrotny iterator dla pozycji za ostatnim elementem w odwrotnej iteracji

Możemy również się dowiedzieć czegoś na temat rozmiarów tablicy:

1
2
3
cout < < a.size() << endl; // wypisze rozmiar tablicy, czyli w tym przypadku 5
cout << (a.empty() ? "Brak elementów" : "Są elementy") << endl;
cout << a.max_size() << endl; // również wypisze 5, gdyż nie możemy zmienić rozmiaru tablicy

Czymże by była tablica bez możliwości dostania się do poszczególnych elementów?

1
2
3
4
a[2] = 10;
cout < < a[2] << endl;
a.at(1) = 15;
cout << a.at(1) << endl;

różnica między operatorem [] a metodą at() jest taka, że at() sprawdza czy nie przekroczyliśmy zakresu, a jeżeli tak to rzuca wyjątek std::range_error. Są jeszcze metody jak front() oraz back(), które zwracają referencję, odpowiednio, pierwszego i ostatniego elementu tablicy. Oprócz tego mamy jeszcze dwie metody zwracające wskaźnik do tablicy:

1
2
a.data(); // read-only
a.c_array(); // tablica w stylu C - odczyt i zapis

Do tego dostajemy jeszcze możliwość zamiany tablic między sobą oraz wypełnienia ich konkretną wartością:

1
2
3
a.swap(b); // zamienia tablice między sobą
swap(a, b); // również zamienia tablice między sobą
a.assign(1); // wypełnia całą tablicę podaną wartością

Oczywiście tablice muszą być takich samych rozmiarów i typów. Mamy jeszcze odpowiednie operatory porównania (==, !=, <, >, <=, >=), ale chyba nie ma sensu się nad nimi rozpisywać. Każdy powinien wiedzieć jak z nich korzystać. :)

Jeden komentarz do “Boost – Array”

  1. Gr4jp3r, dnia 16 lutego 2011 o 20:51 napisał(a):

    może coś jeszcze o boost? Czemu to takie popularne i potrzebne(coś praktycznego) + kolejne biblioteki? Wygląda na bardzo przydatne ;-)

Zostaw komentarz

Subscribe without commenting