Hatena::ブログ(Diary)

#junki::acoustic

2011-06-21 【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

参考

C++編(標準ライブラリ) 第2章 vector

EgtraEgtra 2011/07/01 02:19 Visual C++ 2010など新しいものだと、capacityを縮めるshrink_to_fitというメンバ関数が追加されています。これがあれば、この種のswapとはおさらばできます。