2011-10-09 3 views

答えて

9

自分で書くことは簡単ですが(Aを繰り返して、Bにキーがあるかどうか確認してください)、これはstd::set_differenceの仕事のようです。我々は、しかし、キーを比較するために、ラムダまたはいくつかのカスタム述語が必要になります:

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

あなたはこの自分を書きたい場合はあなたが行うことができますので、あなたは、両方の範囲がすでにソートされているという事実を利用して検討すべきです並行して2つのイテレータを進めることにより、存在のフラットな検索よりも優れています。

あなたがC++ 11を持っていない場合は、だけではなく、ラムダのこの述語を使用します。

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

は、マップされた型には比較がないこと注意してください!したがって、両方のマップに同じ文字列キーがある場合、2つのマップされた値が異なる場合でも、結果にそのような項目はありません。これが望ましくない場合は、別の出力コンテナ(たとえばstd::multimap<my_map::key_type, my_map::mapped_type>)と別の述語が必要です。

関連する問題