从 std::multimap 中删除具有指定键和值的元素

Delete element with specified key and value from std::multimap

假设我知道给定的 std::multimap 恰好有一个元素具有给定的键和值,我想删除这个元素。

可以明确地写一个std::multimap::find来找到一些元素,然后向后走直到我到达具有不同键的第一个元素,向前走,直到找到我想要的元素,然后删除它。

问题: <algorithm> 或其他地方有什么东西可以帮我做这件事吗?还是必须自己写方法?


编辑:这不是STL Multimap Remove/Erase Values相同的问题,后者是关于删除所有具有给定值的元素.

没有任何内置方法可以执行任何涉及键和值搜索的操作,但正如 NathanOliver 在评论中所说,您可以在 multimap::equal_range 之上编写一个辅助函数,例如

#include <map>
#include <iostream>

template<typename K, typename V>
typename std::multimap<K, V>::const_iterator find_item_by_key_and_value(const std::multimap<K, V>& mm, K k, V v) {
    auto range = mm.equal_range(k);
    return std::find_if(range.first, range.second, [v](const auto& p) {return p.second == v; });
}

template<typename K, typename V>
void erase_item_by_key_and_value( std::multimap<K, V>& mm, K k, V v) {
    auto iter = find_item_by_key_and_value(mm, k, v);
    if (iter != mm.end())
        mm.erase(iter);
}

int main()
{
    std::multimap<int, int> mm = { 
       {1,2}, {2,42}, {2,54}, {2, 37}, {42,42} 
    };

    erase_item_by_key_and_value(mm, 2, 37);

    for (const auto& [k, v] : mm) {
        std::cout << "{" << k << " , " << v << "}\n";
    }

}