std::unordered_map erase() 関数ではメモリは解放されない "swap trick"しよう

std::unordered_map における erase() メンバ関数は、指定されたキーに関連する要素をマップから削除します。しかし、erase() を呼び出しただけで、マップの実際に確保されたメモリが自動的に縮小するわけではありません。

C++ の標準ライブラリのコンテナは、メモリの再利用を目的として、通常、要素を削除した際にメモリを解放しない設計になっています。そのため、要素を erase() で削除しても、std::unordered_map の内部に確保されているバケットの数や容量は変わらないことが多いです。

もし、メモリを手動で解放したい場合、コンテナの容量を手動で調整する方法や、新しい std::unordered_map を作成して要素をコピーするなどの方法が考えられます。たとえば、"swap trick" として知られる方法を使用して、現在のマップと空のマップをスワップすることでメモリを解放することができます。

std::unordered_map<KeyType, ValueType>().swap(my_map);

この方法で、my_map のメモリが解放されます。

ただし、頻繁にメモリを解放するとパフォーマンスが低下することがあるため、この操作を行う際には注意が必要です。