2011-10-09 8 views

Odpowiedz

9

Mimo że napisanie tego samemu jest łatwe (powtórzenie ponad A i sprawdzenie, czy klucz jest obecny w B), wygląda to na zadanie dla std::set_difference. Musimy lambda lub jakąś niestandardową orzecznik porównać klucze, ale:

#include <iterator> 
#include <map> 
#include <string> 
#include <algorithm> 

typedef std::map<std::string, MyPtr> my_map; 

my_map A; // given 
my_map B; // given 

void make_a_difference() 
{ 
    my_map C; // will hold the result 

    std::set_difference(A.begin(), A.end(), 
         B.begin(), B.end(), 
         std::insert_iterator<my_map>(C, C.end()), 
       [](const my_map::value_type & a, const my_map::value_type & b) 
       { return a.first < b.first; } 
        ); 
} 

Jeśli chcesz napisać to samemu, należy wziąć pod uwagę korzystając z faktu, że oba zakresy są już posortowane, więc można zrobić lepsze niż płaskie poszukiwania istnienia poprzez równoległe przesuwanie dwóch iteratorów.

Jeśli nie masz C++ 11, wystarczy użyć tego predykatu zamiast lambda:

bool my_comp(const my_map::value_type & a, const my_map::value_type & b) 
{ 
    return a.first < b.first; 
} 

Strzeż, że nie ma porównania na wyznaczonej typu! Więc jeśli posiadasz ten sam klucz ciągu na obu mapach, nie będzie takiej pozycji w wyniku, nawet jeśli dwie odwzorowane wartości różnią się. Jeśli jest to niepożądane, potrzebny jest inny kontener wyjściowy (na przykład std::multimap<my_map::key_type, my_map::mapped_type>) i inny predykat.