2016-11-14 12 views
0

マルチマップmultimap<int,pair<int,int>> edgesを考慮して、edgesで特定のペア(例:make_pair(1,2))の検索方法を教えてもらえますか?ご協力ありがとうございました!マルチマップで値で検索

答えて

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 

またはあなたのコンパイラは、このようなをサポートしていない場合でありますラムダ式のレコードでは、次のように書き直すことができます。

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; 
+0

文章を書いてください。 – Roloka

+0

@Roloka最新の投稿を参照してください。 –

+0

ああ、ありがとう!このページは自動的に更新されません。 :( – Roloka

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; }); 
} 
+0

ありがとうございます!10がペア(1,2)に属しているとします(おそらく他のペアも)。このケースにソリューションを投影してください。 ? – Roloka

関連する問題