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::minmax itd. (zaglavlje <algorithm>)

    • std::min, std::min_exponent itd. (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::ref i std::cref.

  • Vrijeme i trajanje (zaglavlje <chrono>)

    • std::chrono::duration<> vremensko trajanje; std::chrono::seconds, std::chrono::milliseconds itd.

    • 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<> i std::multiset<>

    • std::map<> i std::multimap<>

  • Nesortirani asocijativni spremnici

    • std::unordered_set<> i std::unordered_multiset<>

    • std::unordered_map<> i std::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:

  • *it daje vrijednost na koju iterator pokazuje (može se koristiti i operator ->);

  • ++it pomiče iterator za jedno mjesto unaprijed; --it ga 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_list daje takav iterator; klase unordered_set, unordered_multiset, unordered_map i unordered_multimap daju minimalno takav iterator.

  • Dvosmjerni iterator (Bidirectional iterator) može se kretati naprijed i nazad. Klase list, map, set, multimap i multiset daju 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 + n i it - n gdje je n cijeli broj. Klase vector, deque, array i string daju 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>.