読者です 読者をやめる 読者になる 読者になる

The jonki

呼ばれて飛び出てじょじょじょじょーんき

【C++】 vectorとその容量について

生成したstd::vectorを使い回す際には注意が必要。というのもvectorはそのスコープから外れない限り、eraseしようが確保したメモリ容量は解放しません。

下記はその様子を示したプログラム。erase後にsizeで要素数が減っているのが分かるけど、確保した容量が変わらないことに注目。
swap技法とかいうので新たに確保しなおすことで、回避出来るようです。

学校でC++やらなすぎましたorz

プログラム
#include <iostream>
#include <vector>

int main()
{
	std::vector<int> data;
	for(int i=0; i<1000; i++) {
		data.push_back(i);
	}
	std::cout << "capacity = " << data.capacity() << std::endl;
	std::cout << "size     = " << data.size() << std::endl;

	std::vector<int>::iterator it = data.begin();
	for(int i = 0; i < 990; i++) {
		it = data.erase(it);
	}
	for(it = data.begin(); it != data.end(); ++it) {
		std::cout << *it << " ";
	}
	std::cout << std::endl;
	
	std::cout << "capacity after erase = " << data.capacity() << std::endl;
	std::cout << "size     after erase = " << data.size() << std::endl;
	std::vector<int>(data).swap(data);
	std::cout << "capacity after swap = " << data.capacity() << std::endl;
	std::cout << "size     after swap = " << data.size() << std::endl;

	return 0;
}
実行結果
capacity = 1066
size     = 1000
990 991 992 993 994 995 996 997 998 999
capacity after erase = 1066
size     after erase = 10
capacity after swap = 10
size     after swap = 10