Swap trick vector

Standardowy kontener vector z reguły zaimplementowany jest w taki sposób, aby w minimalizować liczbę wykonywanych realokacji. Z reguły alokuje pamięć na przechowywanie większej liczby elementów niż się w nim znajduje.
Za pomocą metody capacity możemy sprawdzić ile jeszcze elementów wstawić do kontenera vector bez potrzeby jego realokacji. Liczbę wstawionych elementów w vectorze sprawdzamy metodą size.
Niekiedy zdarza się, że po wstawieniu dużej liczby elementów, część z nich usuwamy i zmieniamy rozmiar vectora za pomocą metody resize. W większości implementacji capacity ( pojemność vectora) pozostanie taka sama, a to oznacza, że pamięć pomimo tego, że nieużywana nie zostanie oddana do systemu operacyjnego. Aby mieć pewność, że pamięć zostanie zwolniona należy utworzyć tymczasowy obiekt vector i przekazać do konstruktora kopiującego vector, którego rozmiar chcemy zmniejszyć, wywołać metodę swap vectora tymczasowego podając jako parametr vector, którego rozmiar zmniejszamy. Demonstruje to poniższy kod:

{
        vector<int> tmp(test);
        tmp.swap(test);
}

Powyższe linie możemy zastąpić wywołaniem jednoliniowym:
vector<int>(test).swap(test);

A oto przykład kodu demonstrującego w pełni powyżej opisaną technikę:
#include <vector>
#include <iostream>
#include <ostream>
#include <algorithm>
#include <iterator>
using namespace std;
 
int random(){
    static int i = 0;
    return ++i;
}
 
int main(){
    const int V_BIG_SIZE = 20;
    const int V_SMALL_SIZE = 10;
    vector<int> test;
    generate_n(back_inserter(test), V_BIG_SIZE, random);
    copy(test.begin(), test.end(), ostream_iterator<int>(cout, " "));
    cout<<"\ncapacity: "<<test.capacity()<<" size: "<<test.size()<<endl;
    test.resize(V_SMALL_SIZE);
    cout<<"\ncapacity: "<<test.capacity()<<" size: "<<test.size()<<endl;
    vector<int>(test).swap(test);
    cout<<"\ncapacity: "<<test.capacity()<<" size: "<<test.size()<<endl;
    return 0;
}
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License