std::vector::swap în C++

std::vector C++98

Schimbă instant conținutul a doi vectori de același tip, fără să copieze elementele.

Sintaxă
void swap(vector& altul) noexcept;

Ce face std::vector::swap

a.swap(b) schimbă între ei vectorii a și b: elementele, dimensiunea și capacitatea. Nu se copiază niciun element, se schimbă doar pointerii interni, așa că operația durează la fel de puțin oricât de mari sunt vectorii.

Iteratorii și referințele rămân valide, dar acum indică elemente din celălalt vector. Același efect are std::swap(a, b).

Parametri

Parametru Descriere
altul Vectorul cu care se face schimbul; trebuie să aibă același tip de elemente.

Ce returnează

Nimic (void).

Exemple

Exemplul 1: Schimbarea a două liste

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

int main() {
    std::vector<std::string> azi{"Ana", "Ion"};
    std::vector<std::string> maine{"Maria", "Dan", "Elena"};
    azi.swap(maine);
    std::println("azi:   {}", azi);
    std::println("mâine: {}", maine);
}

Rezultat

azi:   ["Maria", "Dan", "Elena"]
mâine: ["Ana", "Ion"]

Exemplul 2: Eliberarea sigură a memoriei

Schimbăm vectorul mare cu unul gol, temporar. Vectorul temporar ia memoria cu el și o eliberează la final.

#include <print>
#include <vector>

int main() {
    std::vector<int> mare(100000, 1);
    mare.clear();
    std::println("după clear: capacity={}", mare.capacity());
    std::vector<int>().swap(mare);
    std::println("după swap:  capacity={}", mare.capacity());
}

Rezultat

după clear: capacity=100000
după swap:  capacity=0

Greșeli frecvente

  • Schimbi conținutul cu auto tmp = a; a = b; b = tmp;. Asta copiază toate elementele de trei ori; a.swap(b) sau std::swap(a, b) nu copiază nimic.

Comenzi înrudite

  • std::vector::clear: Șterge toate elementele vectorului; dimensiunea devine 0, dar memoria rezervată rămâne.
  • 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::assign: Înlocuiește tot conținutul vectorului cu n copii ale unei valori, cu un interval sau cu o listă.