std::vector::resize în C++

std::vector C++98

Schimbă numărul de elemente: adaugă elemente noi la final sau le șterge pe cele în plus.

Sintaxă
void resize(size_type n);
void resize(size_type n, const T& valoare);

Ce face std::vector::resize

resize(n) face ca vectorul să aibă exact n elemente. Dacă n este mai mare decât size(), adaugă la final elemente noi: 0 pentru numere, text gol pentru std::string, sau valoare, dacă o dai. Dacă n este mai mic, șterge elementele de la final.

Diferența față de reserve: resize creează elemente reale (le poți accesa cu v[i]), iar reserve doar rezervă memorie, fără să schimbe size(). Dacă resize crește vectorul peste capacitate, se realocă memoria și toți iteratorii devin invalizi.

Parametri

Parametru Descriere
n Noua dimensiune.
valoare Valoarea elementelor adăugate (opțională).

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Mărire și micșorare

#include <print>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3};
    v.resize(5);          // adaugă două zerouri
    std::println("{}", v);
    v.resize(7, 9);       // adaugă două elemente egale cu 9
    std::println("{}", v);
    v.resize(2);          // păstrează doar primele două
    std::println("{}", v);
}

Rezultat

[1, 2, 3, 0, 0]
[1, 2, 3, 0, 0, 9, 9]
[1, 2]

Exemplul 2: Pregătirea unui vector pentru scriere cu indice

După resize(7), pozițiile 0-6 există, deci vanzari[zi] += ... este corect.

#include <print>
#include <vector>

int main() {
    std::vector<int> vanzari;
    vanzari.resize(7);                         // câte o poziție pentru fiecare zi
    int bonuri[][2] = {{0, 120}, {2, 75}, {0, 30}, {6, 210}};   // {zi, sumă}
    for (const auto& bon : bonuri) {
        vanzari[static_cast<std::size_t>(bon[0])] += bon[1];
    }
    std::println("{}", vanzari);
}

Rezultat

[150, 0, 75, 0, 0, 0, 210]

Greșeli frecvente

  • Folosești reserve(n) și apoi scrii v[i] = .... După reserve, vectorul are tot 0 elemente; ai nevoie de resize(n) (sau de push_back).
  • Faci resize mai mare și apoi push_back, crezând că valorile vor intra pe pozițiile noi. push_back adaugă după elementele create de resize.

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::size: size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.
  • std::vector::assign: Înlocuiește tot conținutul vectorului cu n copii ale unei valori, cu un interval sau cu o listă.