2016-04-20 5 views
4

に存在する場合、私が持っているチェック++と私は十分に速く、参照用の2つのmapに私のオブジェクトを格納したいと思います。Cは、私自身のオブジェクト</p> <pre><code>class my_object { int id; bool state; string name; string vendor; } </code></pre> <p>オブジェクトは二つのマップ

std::map<string, my_object> map1; 
std::map<string, my_object> map2; 

最後に、私は私のオブジェクトの一部のキーがあるかどうかを確認したいの両方のマップに存在する:

for(each my_object m1 in map1 and my_object m2 in map2 have the same key) 
//for example, key "Bob" have corresponding objects in map1 and map2 
{ 
    if(m1.vendor == m2.vendor) 
    { 
    //do some work 
    } 
} 

どのように私は2つのマップに比較する仕事を達成することができますか? また、別のデータ構造を使用する必要がありますか?

更新日: 返信いただきありがとうございます。

function1() //returns map1; 
function2() //returns map2; 

両方のマップに使用されるキーは、my_objectをのname分野である2つの異なる機能は、マップを生成しますので、 私は2つのマップを使用していますなぜです。 「十分に速い参照」については、map1にn個の要素がある場合、map2にm個の要素があり、計算時間はn * mですか?

+1

2つのマップでは2つのキーが何ですか? 1つのマップは 'name'と' vendor'によってキーイングされていますか? –

+1

解決策が必要ですが、効率的です。あなたが何をしようとしているか教えてくれたら助けになるかもしれません。 –

+1

同じキーが両方のマップにある場合、同じオブジェクトが保証されますか? –

答えて

4

あなたがここに

for (const auto& m1 : map1) { 
    auto i2 = map2.find(m1.first); 
    if (i2 != map2.end() && m1.second.vendor == i2->second.vendor) { 
     // do some work 
    } 
} 
3

マップの1つを反復することができます(要素の数が著しく異なり、パフォーマンスが重要な場合は短いものを選ぶのが理想です)。 std::map::find)。

for (const auto& kv : map1) 
{ 
    auto it2 = map2.find(kv.first); 
    if (it2 != map2.end() && kv.second.vendor == it2->second.vendor) 
     ...do whatever... 
} 
1

することができますが、両方のマップに存在する各キーの任意の関数を呼び出しますプログラムです。これは、std::set_intersectionのサンプル実装に基づいています。

vendor等価性テストを実行するためにラムダを修正することができます。

#include <map> 
#include <string> 
#include <iostream> 

template<typename K, typename V1, typename V2, typename Func> 
void map_intersection(std::map<K,V1> const &m1, std::map<K,V2> const &m2, Func f) 
{ 
    auto it1 = m1.begin(), it2 = m2.begin(); 

    while (it1 != m1.end() && it2 != m2.end()) { 
     if (it1->first < it2->first) { 
      ++it1; 
     } else { 
      if (!(it2->first < it1->first)) { 
       f(it1->second, it2->second); 
      } 
      ++it2; 
     } 
    } 
} 

int main() 
{ 
    std::map<std::string, std::string> map1 = { {"a", "apple"}, {"b", "bug"}, {"c", "car"} }; 
    std::map<std::string, std::string> map2 = { {"b", "boat"}, {"c", "car"} }; 

    map_intersection(map1, map2, [](std::string const &v1, std::string const &v2) 
    { 
     std::cout << "Same key: " << v1 << "," << v2 << '\n'; 
    }); 
} 

出力:

Same key: bug,boat 
Same key: car,car 
関連する問題