FANDOM


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;
}

--Chq 11:29, 21 maj 2006 (UTC)

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki