2011-10-09 13 views

回答

9

儘管您自己編寫代碼很容易(重複執行A並檢查密鑰是否存在於B中),但這看起來像std::set_difference的作業。我們需要一個lambda或一些自定義的謂詞鍵進​​行比較,雖然:

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

如果你想這個寫自己,你應該考慮的事實,這兩個區域都已經按順序排列的,所以你可以做通過並行推進兩個迭代器,比單純搜索存在更好。

如果你沒有C++ 11,只是使用的,而不是拉姆達這個謂詞:

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

當心有上映射的類型沒有可比性!因此,如果在兩個映射中都有相同的字符串鍵值,那麼結果中就不會有這樣的項目,即使兩個映射值不同。如果這是不可取的,你需要一個不同的輸出容器(例如一個std::multimap<my_map::key_type, my_map::mapped_type>)和一個不同的謂詞。