Osnovni elementi Standardne biblioteke
Osnovni elementi Standardne biblioteke su sljedeći:
-
Pomoćne klase
-
Spremnici
-
Iteratori
-
Algoritmi
-
Stringovi
-
Regularni izrazi
-
Ulazno-izlazna biblioteka
-
Internacionalizacija (locale)
-
Generatori slučajnih brojeva, kompleksni brojevi i matematičke funkcije
-
Podrška za višedretveno programiranje
Literatura: N. M. Josuttis: The C++ standard library, drugo izdanje (2012) Addison Wesley.
Centralni dio Standardne biblioteke čine:
-
Spremnici
-
Iteratori
-
Algoritmi
Iteratori povezuju spremnike i algoritme čineći ih međusobno neovisnim.
Pomoćne klase
-
Uređeni parovi i uređene n-torke
-
std::pair<>par, uređena dvojka,std::swap(zaglavlje<utility>). -
std::tuple<>uređena n-torka, (zaglavlje<tuple>).
-
-
Pomoćne funkcije i numerički limiti
-
std::min,std::max,std::minmaxitd. (zaglavlje<algorithm>) -
std::min,std::min_exponentitd. (zaglavlje<limits>)
-
-
Pametni pokazivači (zaglavlje
<memory>):-
shared_ptr<> -
weak_ptr<> -
unique_ptr<>
-
-
Klase obilježja (zaglavlje
<type_traits>)-
std::is_pointer<>,std::is_polymorphic<>,std::remove_reference<>itd. -
std::refistd::cref.
-
-
Vrijeme i trajanje (zaglavlje
<chrono>)-
std::chrono::duration<>vremensko trajanje;std::chrono::seconds,std::chrono::millisecondsitd. -
std::chrono::time_point<>vremenski trenutak, -
std::chrono::system_clock,std::chrono::steady_clock,std::chrono::high_resolution_clock.
-
Spremnici
Svaki spremnik sadrži kolekciju objekata specificiranog tipa. Kada objekte dohvaćamo i spremamo prema njihovoj poziciji u spremniku, onda govorimo o sekvencijalnom spremniku. Kod asocijativnih spremnika elementi se dohvaćaju pomoću ključa.
-
Sekvencijalni spremnici
-
std::array<> -
std::vector<> -
std::deque<>red (double-ended queue) -
std::list<>dvostruko povezana lista -
std::forward_list<>jednostruko povezana lista
-
-
Asocijativni spremnici
-
std::set<>istd::multiset<> -
std::map<>istd::multimap<>
-
-
Nesortirani asocijativni spremnici
-
std::unordered_set<>istd::unordered_multiset<> -
std::unordered_map<>istd::unordered_multimap<>
-
-
Specijalni spremnici
-
std::stack<> -
std::queue<> -
std::priority_queue<> -
std::bitset<>
-
-
Stringovi (zaglavlje
<string>)
Iteratori
Iteratori su objekti koji predstavljaju poziciju unutar spremnika.
U C++-u imaju semantiku pokazivača. Na iteratoru it:
-
*itdaje vrijednost na koju iterator pokazuje (može se koristiti i operator->); -
++itpomiče iterator za jedno mjesto unaprijed;--itga pomiče za jedno mjesto unatrag; -
Operatori
==i!=uspoređuju iteratore.
Svaki spremnik definira svoje iteratore i nudi metode begin() i end() za iteriranje kroz spremik.
Primjer iteriranja kroz spremnik:
std::list<int> li;
// ...
for(auto it=li.begin(); it != li.end(); ++it)
// ...
Iteratori begin() i end() određuju pluotvoreni interval:
-
begin()pokazuje na prvi element u spremniku; -
end()pokazuje na jedno mjesto iza zadnjeg elementa u spremniku.
Konstantne iteratore (kroz koje ne možemo mijenjati elemente spremnika) vraćaju metode cbegin() i cend().
Kategorije iteratora
-
Jednosmjerni iterator (Forward iterator) može se kretati samo prema naprijed. Klasa
forward_listdaje takav iterator; klaseunordered_set,unordered_multiset,unordered_mapiunordered_multimapdaju minimalno takav iterator. -
Dvosmjerni iterator (Bidirectional iterator) može se kretati naprijed i nazad. Klase
list,map,set,multimapimultisetdaju takve iteratore. -
Iterator izravnog pristupa (Random-access iterator) dozvoljavaju direktan pristup elementu (a ne samo pomicanje za jedno mjesto). Direktan pristup se postiže pomoću iteratorske aritmetike,
it + niit - ngdje jencijeli broj. Klasevector,deque,arrayistringdaju takve iteratore.
Postoje još i kategorije:
-
Ulazni iterator (Input iterator) kreće se samo prema naprijed i može jedino čitati (
std::istream_iterator<>); -
Izlazni iterator (Output iterator) kreće se samo prema naprijed i može jedino pisati (
std::ostream_iterator<>).
Algoritmi
Algoritmi su globalne parametrizirane funkcije koje djeluju na spremnicima kroz iteratore.
Algoritmi su neovisni o spremnicima na kojima rade i ovise samo o kategoriji iteratora. Nikad ne vrše operacije koje nude spremnici.
Većina algoritama je u zaglavlju <algorithm>.
std::vector<int> vi;
auto it = std::find(vi.begin(), vi.end(), // raspon
5); // vrijednost
if(it != vi.end())
std::cout << "Element 5 je u spremniku.\n";
else
std::cout << "Element 5 nije u spremniku.\n";
Mnogi algoritmi uzimaju predikat (funkciju koja vraća vrijednost tipa bool).
auto it = std::find_if(vi.begin(), vi.end(), // raspon
[](int x){ return !(x % 2); }); // predikat
if(it != vi.end())
std::cout << "Barem jedan parni broj je u spremniku.\n";
else
std::cout << "Nema parnih brojeva u spremniku.\n";
Kad algoritmi uzimaju dva (ili više) raspona programer treba osigurati da drugi (zadnji) raspon ima jednak broj elemenata kao i prvi.
std::list<int> li{1,4,3,9};
std::vector<int> vi;
vi.resize(li.size()); // Osiguraj dovoljno mjesta za kopiranje.
std::copy(li.begin(), li.end(), // polazni raspon
vi.begin()); // dolazni raspon
Stringovi
Klasa std::string je definirana u zaglavlju <string>.
Sučelje klase je vrlo slično klasi std::vector s nizom posebnih metoda za rad sa stringovima.
Postoje značajne razlike u odnosu na klasu std::vector jer ugrađeni algoritmi rade s indeksima
umjesto s pokazivačima:
std::string s;
std::string::size_type idx;
// ...
idx = s.find("substring");
if(idx == std::string::npos)
std::cout << "substring nije nadjen.\n";
else
// ...
Za korištenje string funkcija iz jezika C treba uključiti zaglavlje <cstring>.