

std::multimapは、私は見た目的に以下の様なハッシュテーブル構造になっている(リスト表示になってますが...)と理解しています(データ構造的にはツリー構造)。

  * KEY_A 
    * DATA_A
    * DATA_B
    * DATA_C
  * KEY_B 
    * DATA_D
    * DATA_E
    * DATA_F

このとき、DATA_Aのみを削除したい場合はどのようにすればよいのでしょうか。  
というのも、multimapが出来る要素の削除はキーのみとなっているようで、値を削除することは出来ないようなのです。

そもそも、キーではなく値を削除し、また自動で空いた部分を詰めるような仕組み自体はmultimapには存在するのでしょうか。

よろしくお願いいたします。

参照URL：<http://vivi.dyndns.org/tech/cpp/multimap.html>


CC BY-SA 3.0
2017-05-10T09:49:08.153
34607
2017-07-18T06:07:24.320
20642
question
c++
std::multimapの要素の削除方法


既にコメントされていますが、[`erase(iterator
position)`](https://cpprefjp.github.io/reference/map/multimap/erase.html)で指定した要素を削除できます。

[code]

    // ペアを指定して削除するバージョン
    template<class MultiMap>
    void erase(MultiMap& map, typename MultiMap::value_type const& value) {
        map.erase(find(begin(map), end(map), value));
    }
    
    // データを指定して削除するバージョン
    template<class MultiMap>
    void erase(MultiMap& map, typename MultiMap::mapped_type const& mapped) {
        map.erase(find_if(begin(map), end(map), [&](auto const& value) {
            return std::get<1>(value) == mapped;
        }));
    }
    
    int main() {
        std::multimap<int, int> m{ { 0, 0 }, { 1, 1 } };
        erase(m, { 0, 0 });
        erase(m, 1);
    }
    
[/code]

例えばこんな関数を用意しておけば消せるわけですが、ペアが見つからなかった場合やデータが複数見つかった場合にどうするかなど状況に応じて設計が変わってくると思います。  
（なのでSTLとしては`iterator`を指定しての削除など基本的な機能しか提供しなかったのかなと。）


CC BY-SA 3.0
2017-05-10T22:03:38.783
34616
2017-05-10T22:03:38.783
4236
34607
answer