从 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";
}
}
假设我知道给定的 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";
}
}