2011-10-09 29 views

cevap

9

Bunu kendiniz yazacak kadar kolay olsa da (A üzerinden yineleyin ve anahtarın B'da mevcut olup olmadığını kontrol edin), bu std::set_difference için bir işe benziyor. Bu kendini yazmak istiyorsanız her iki aralıkları zaten sıralanır gerçeği yararlanarak düşünmelisiniz,

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

, bu nedenle yapabilirsiniz: Biz olsa lambda veya anahtarları karşılaştırmak için bazı özel yüklemi, gerekir paralel olarak iki yineleyici ilerleyerek varoluş için düz bir arama daha iyi.

C++ 11 yoksa, sadece yerine lambda bu yüklemi:

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

eşlenmiş türüne hiçbir karşılaştırma olduğunu dikkat! Dolayısıyla, her iki haritada da aynı dize anahtarı varsa, iki eşlenen değer farklı olsa bile sonuçta böyle bir öğe olmayacaktır. Bu istenmeyen bir durumsa, farklı bir çıktı kabına (örneğin, std::multimap<my_map::key_type, my_map::mapped_type>) ve farklı bir yüklemeye ihtiyacınız vardır.