2016-04-20 9 views
4

Ich habe mein eigenes ObjektC++ überprüfen, ob ein Objekt in zwei Karten besteht

class my_object 
{ 
    int id; 
    bool state; 
    string name; 
    string vendor; 
} 

Und ich möchte mein Objekt speichern in zwei map für schnell genug Referenz.

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

Schließlich möchte ich, wenn es zu überprüfen, einige Tasten meines Objekt existiert in beiden Karten sind:

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 
    } 
} 

Wie kann ich das vergleichen erreichen Job in zwei Karten? Oder sollte ich eine andere Datenstruktur verwenden?

UPDATE: Danke für die Antworten. Warum ich zwei Karten verwenden, weil zwei unterschiedliche Funktion, um die Karten produzieren:

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

Die in den beiden Karten verwendeten Schlüssel der name Bereich my_object sind. Für "schnell genug Referenz" dachte ich, dass, wenn Map1 n Elemente hat, Map2 m Elemente hat, ist meine Rechenzeit n * m?

+1

Was sind die zwei Schlüssel in den beiden Karten? Ist eine Karte mit 'name' und die andere mit' vendor' versehen? –

+1

Es muss eine Lösung geben, aber es wäre so effizient. Wenn Sie uns gesagt haben, was Sie zu tun versuchen, kann es helfen. –

+1

Wenn der gleiche Schlüssel in beiden Karten ist garantiert das gleiche Objekt? –

Antwort

4

Sie können

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

Sie können über eine der Karten iterieren (idealerweise würden Sie die kürzere wählen, wenn die Anzahl der Elemente stark variieren könnte und die Leistung von Bedeutung ist) und dabei nach jeder Taste der anderen Karte suchen (mit 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

Hier ist ein Programm, das eine beliebige Funktion für jede Taste aufrufen wird, die in beiden Karten vorhanden. Es basiert auf der Beispielimplementierung von std::set_intersection.

Sie könnten das Lambda ändern, um Ihren vendor Gleichheitstest oder was auch immer Sie überprüfen möchten, durchzuführen.

#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'; 
    }); 
} 

Ausgang:

Same key: bug,boat 
Same key: car,car 
Verwandte Themen