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)saustd::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ă.