Ce face std::vector::size
size() returnează numărul de elemente, ca valoare de tip std::size_t (un întreg fără semn). empty() returnează true dacă size() == 0 și este forma recomandată pentru a verifica dacă vectorul e gol.
Pentru că size() nu are semn, ai grijă când îl compari sau îl scazi: v.size() - 1 pe un vector gol nu dă -1, ci un număr uriaș. În C++20 există și std::ssize(v), care dă dimensiunea cu semn.
Nu confunda size() (elemente existente) cu capacity() (loc rezervat în memorie).
Ce returnează
size(): numărul de elemente (std::size_t). empty(): true sau false.
Exemple
Exemplul 1: Numărul de elemente și verificarea vectorului gol
#include <print>
#include <string>
#include <vector>
int main() {
std::vector<std::string> participanti{"Ana", "Mihai", "Ioana"};
std::println("Participanți: {}", participanti.size());
std::vector<std::string> asteptare;
if (asteptare.empty()) {
std::println("Lista de așteptare este goală.");
}
}
Rezultat
Participanți: 3
Lista de așteptare este goală.
Exemplul 2: Parcurgere cu indice, fără avertismente
Indicele are tipul std::size_t, la fel ca size(), ca să nu compari un număr cu semn cu unul fără semn (cu -Werror, asta ar opri compilarea).
#include <print>
#include <vector>
int main() {
std::vector<double> temperaturi{12.5, 14.0, 9.5, 16.0};
for (std::size_t i = 0; i < temperaturi.size(); ++i) {
std::println("Ziua {}: {} °C", i + 1, temperaturi[i]);
}
}
Rezultat
Ziua 1: 12.5 °C
Ziua 2: 14 °C
Ziua 3: 9.5 °C
Ziua 4: 16 °C
Exemplul 3: Capcana lui size() – 1
Pe un vector gol, scăderea dă cea mai mare valoare fără semn. std::ssize rezolvă problema.
#include <print>
#include <vector>
int main() {
std::vector<int> gol;
std::println("gol.size() - 1 = {}", gol.size() - 1);
std::println("std::ssize(gol) - 1 = {}", std::ssize(gol) - 1);
}
Rezultat
gol.size() - 1 = 18446744073709551615
std::ssize(gol) - 1 = -1
Greșeli frecvente
- Scrii
for (int i = 0; i < v.size(); ++i): compariintcustd::size_tși primești avertismentul-Wsign-compare. Foloseștestd::size_t isau o buclăfor (auto x : v). - Parcurgi invers cu
for (std::size_t i = v.size() - 1; i >= 0; --i). Condițiai >= 0este mereu adevărată pentru un număr fără semn, deci bucla nu se oprește. Folosește iteratori inverși (rbegin) saufor (std::size_t i = v.size(); i-- > 0;). - Scrii
v.size() == 0peste tot. Funcționează, darv.empty()spune mai clar ce vrei.
Comenzi înrudite
std::vector::reserve: reserve() rezervă memorie pentru n elemente, capacity() spune cât loc este rezervat, iar shrink_to_fit() cere eliberarea locului nefolosit.std::vector::resize: Schimbă numărul de elemente: adaugă elemente noi la final sau le șterge pe cele în plus.std::size: std::size dă numărul de elemente al unui container sau tablou C; std::empty spune dacă nu are elemente.std::vector::clear: Șterge toate elementele vectorului; dimensiunea devine 0, dar memoria rezervată rămâne.