在multimap中按值搜索

Search by value in a multimap

本文关键字:搜索 multimap      更新时间:2023-10-16

考虑一个multimap multimap<int,pair<int,int>> edges,谁能帮助我在如何搜索edges中给定对(例如make_pair(1,2))的位置?谢谢你的帮助!

std::multimap仅按其Key进行索引。虽然您可以按值搜索,但这将是线性搜索(没有按键搜索效率高)。我建议你购买Boost。Bimap和Boost.MultiIndex。尽管如此,要按键搜索,您可以这样做:

template<typename Map, typename Val = typename Map::value_type>
auto find_by_key(Map& mp, Val val){
    return std::find_if(mp.begin(), mp.end(), [](auto& kv){ return kv.second == val; });
}

没有什么比使用标准算法std::find_if的线性搜索更好的了。:)

例如

#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <utility>
int main() 
{
    std::unordered_map<int, std::pair<int, int>> edges = 
    { 
        { 1, { 1, 1 } }, { 2,{ 2, 2 } }, { 3, { 3, 3 } }
    };

    auto it = std::find_if( edges.begin(), edges.end(),
              [p = std::make_pair( 2, 2 )]( const auto &value )
              {
                return value.second == p; 
              });
              std::cout << it->second.first << ' ' 
                        << it->second.second << std::endl;
    return 0;
}

程序输出为

2 2

或者如果你的编译器不支持这样的lambda表达式记录,那么你可以这样重写

auto p = std::make_pair( 2, 2 );
auto it = std::find_if( edges.begin(), edges.end(),
          [&]( const auto &value )
          {
            return value.second == p; 
          });
          std::cout << it->second.first << ' ' 
                    << it->second.second << std::endl;