std::vector::clear în C++

std::vector C++98

Șterge toate elementele vectorului; dimensiunea devine 0, dar memoria rezervată rămâne.

Sintaxă
void clear() noexcept;

Ce face std::vector::clear

clear() distruge toate elementele, iar size() devine 0. Capacitatea (memoria rezervată) nu se schimbă, așa că un vector golit poate fi umplut din nou fără realocări.

Toți iteratorii, pointerii și referințele la elemente devin invalide. Dacă vrei să eliberezi și memoria, apelează după clear() și shrink_to_fit().

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Golirea coșului

#include <print>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> cos{"mere", "pere", "prune"};
    std::println("Înainte: {} (capacity {})", cos, cos.capacity());
    cos.clear();
    std::println("După:    {} (size {}, capacity {})", cos, cos.size(), cos.capacity());
}

Rezultat

Înainte: ["mere", "pere", "prune"] (capacity 3)
După:    [] (size 0, capacity 3)

Exemplul 2: Reutilizarea aceluiași vector

La fiecare zi refolosim vectorul: clear() păstrează memoria, deci nu se mai alocă din nou.

#include <print>
#include <vector>

int main() {
    std::vector<std::vector<int>> zile{{5, 3}, {8, 1, 4}, {2}};
    std::vector<int> vanzari;
    for (const auto& zi : zile) {
        vanzari.clear();
        for (int x : zi) {
            vanzari.push_back(x * 10);
        }
        std::println("{}", vanzari);
    }
}

Rezultat

[50, 30]
[80, 10, 40]
[20]

Greșeli frecvente

  • Te aștepți ca memoria să fie eliberată după clear(). Nu este; folosește shrink_to_fit() dacă vectorul era mare și nu îl mai umpli.
  • Folosești un iterator obținut înainte de clear(). După golire, el nu mai indică un element valid.

Comenzi înrudite

  • std::vector::erase: Șterge un element sau un interval de elemente din vector și returnează iteratorul elementului de după.
  • 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::size: size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.