de Alex Vasiluță
std::vector
, std::queue
, std::map
, std::priority_queue
, etcNOTĂ: std::
reprezintă namespace-ul în care se află la început containerele STL. Putem să omitem utilizarea sa dacă punem using namespace std;
la începutul programului.
În exemplele de cod voi utiliza keyword-ul auto
. El deduce automat tipul bazat pe ce valoare îi dai, dar nu poate fi schimbat.
De exemplu, pot face auto x = ceva();
și el va lua tipul rezultatului funcției ceva()
. Însă, nu pot declara auto x;
deoarece nu are de unde să preia tipul.
std::vector
std::deque
std::queue
std::stack
std::string
std::tuple
std::pair
std::vector
// Afișează elementul de la poziția x
// (fiind indexat de la 0, al x+1 -lea element)
cout << v[x] << endl;
std::deque
Seamănă mult cu std::vector, dar poți să inserezi/ștergi și din față, și din spate
Pe lângă ce are vector-ul, oferă încă două funcții: push_front()
și pop_front()
push_back()
și pop_back()
, dar inserează la începutstd::queue
std::stack
std::string
string s1 = "ana", s2 = "ion", s3 = "popescu";
s1.compare(s2); // -1, "ana" este înaintea lui "ion" în dicționar
s1.compare(s1); // 0, "ana" este identic cu "ana"
s3.compare(s1); // 1, "popescu" este după "ana" în dicționar
string s;
cin >> s; // Citește un șir de lungime arbitrară
getline(cin, s); // Citește o linie întreagă
getline(cin, s, '#'); // Citește până la delimitatorul '#'
cout << s; // Afișează s
std::tuple
sau
sau
std::pair
sau
// p.first - primul element din pereche
// p.second - al doilea element din pereche
cout << p.first << " " << p.second;
sau
Structurile STL cu număr variabil de elemente au câteva funcții în comun:
.size()
- câte elemente sunt în structură.empty()
- spune dacă structura este goală.clear()
care elimina toate elementele din eaContainerele pot fi comparate cu operatorii standard (==
, !=
, >=
, etc)
De asemenea, aproape fiecare structură implementează proprii săi iteratori
[start, end)
..end()
.begin()
- iterator la primul element din structură.end()
- iterator past-the-end pentru structură.Să parcurgi structura
++it
) să se ducă mai departe.it++
, dar de obicei este mai lent.Să îl pui drept parametru la o funcție
<algorithm>
care merg pe range-uri cer un iterator de început și un iterator "past-the-end".
sort()
cere doi iteratori: unul care marchează începutul și elementul de după sfârșit (cum ar fi begin()
și end()
).std::vector
și std::deque
oferă și funcțiile .erase()
și .insert()
.insert()
adaugă un element înaintea elementului iteratorului..erase()
poate primi un singur argument, elementul care să fie șters, sau două argumente, range-ul pe care să îl șteargă.Fun fact:
Un pointer respectă cerințele interne pentru un iterator. De aceea, putem face sort(v+1, v+n+1);
pentru vectori non-STL!
vector<int> v;
v.resize(3);
v[0] = 3;
v[2] = 1;
v[1] = 2;
// v[] = {3, 2, 1}
sort(v.begin(), v.begin() + 2); // sortează primele 2 elemente
// v[] = {2, 3, 1}
reverse(v.begin(), v.end()); // inversează vectorul
// v[] = {1, 3, 2}
for (auto it = v.begin(); it != v.end(); ++it)
cout << *it << " "; // afișează toate elementele vectorului
cout << endl;
v.erase(v.begin());
v.insert(v.begin(), 15);
for (auto i : v)
cout << i << " "; // 15 3 2
cout << endl;
cout << v.size() << " " << v.empty() << endl; // 3 0
v.clear(); // Șterge toate elementele din vector
cout << v.empty() << endl; // 1
std::set
std::map
std::unordered_map
, std::unordered_set
Fiecare din acestea are o variantă multi
, dar personal nu am simțit vreodată nevoia lor
std::set
// returnează un pair cu:
// - un iterator la elementul inserat
// - un bool care spune dacă a avut loc inserarea (true) sau dacă exista deja (false)
vals.insert(2);
auto it = vals.find(2);
if(it == vals.end())
{
cout << "Nu am găsit valoarea `2` în set\n";
} else
{
cout << "Am găsit `2` în set\n";
}
// sau
int cnt = vals.count(2);
if(cnt == 1) // cnt e fie 0, fie 1 din cauza naturii structurii
{
cout << "Am găsit valoarea `2` în set\n";
} else
{
cout << "N-am găsit valoarea `2` în set\n";
}
std::map
std::unordered_set
, std::unordered_map
std::set
și std::map
funcționează practic la fel, dar au câteva limitări care fac mai dificil lucrul cu containere STL drept keys (cum ar fi std::pair
)