生成した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