std::vector::size în C++

std::vector C++98

size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.

Sintaxă
size_type size() const noexcept;
bool empty() const noexcept;

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): compari int cu std::size_t și primești avertismentul -Wsign-compare. Folosește std::size_t i sau o buclă for (auto x : v).
  • Parcurgi invers cu for (std::size_t i = v.size() - 1; i >= 0; --i). Condiția i >= 0 este mereu adevărată pentru un număr fără semn, deci bucla nu se oprește. Folosește iteratori inverși (rbegin) sau for (std::size_t i = v.size(); i-- > 0;).
  • Scrii v.size() == 0 peste tot. Funcționează, dar v.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.