std::list<int> li;
// ...
for(auto it=li.begin(); it != li.end(); ++it)
// ...
Osnovni elementi Standardne biblioteke su sljedeći:
Literatura: N. M. Josuttis: The C++ standard library, drugo izdanje (2012) Addison Wesley.
Centralni dio Standardne biblioteke čine:
Iteratori povezuju spremnike i algoritme čineći ih međusobno neovisnim.
std::pair<> par, uređena dvojka, std::swap (zaglavlje <utility>).
std::tuple<> uređena n-torka, (zaglavlje <tuple>).
std::min, std::max, std::minmax itd. (zaglavlje <algorithm>)
std::min, std::min_exponent itd. (zaglavlje <limits>)
<memory>):
shared_ptr<>
weak_ptr<>
unique_ptr<>
<type_traits>)
std::is_pointer<>, std::is_polymorphic<>, std::remove_reference<> itd.
std::ref i std::cref.
<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.
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.
std::array<>
std::vector<>
std::deque<> red (double-ended queue)
std::list<> dvostruko povezana lista
std::forward_list<> jednostruko povezana lista
std::set<> i std::multiset<>
std::map<> i std::multimap<>
std::unordered_set<> i std::unordered_multiset<>
std::unordered_map<> i std::unordered_multimap<>
std::stack<>
std::queue<>
std::priority_queue<>
std::bitset<>
<string>)
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;
== 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().
forward_list daje takav iterator;
klase unordered_set, unordered_multiset, unordered_map i unordered_multimap daju minimalno takav iterator.
list, map, set, multimap i
multiset daju takve iteratore.
it + n i it - n gdje je n cijeli broj.
Klase vector, deque, array i string daju takve iteratore.
Postoje još i kategorije:
std::istream_iterator<>);
std::ostream_iterator<>).
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
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>.