2011-10-09 14 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>)和一个不同的谓词。