在多图中按值搜索

时间:2016-11-14 18:36:51

标签: c++ multimap

考虑多地图multimap<int,pair<int,int>> edges,是否有人可以帮助我如何在edges中搜索给定对的位置(例如make_pair(1,2))?谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

没有比使用标准算法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;

答案 1 :(得分:0)

std::multimap仅按其Key编制索引。您可以按值搜索,但这将是线性搜索(不是像按键搜索那样有效)。我建议您结帐Boost.BimapBoost.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; });
}