2011-10-09 12 views

Respuesta

9

Si bien es bastante fácil escribir esto usted mismo (iterar sobre A y verificar si la clave está presente en B), esto parece un trabajo para std::set_difference. Vamos a necesitar una lambda o algún predicado a medida para comparar claves, sin embargo:

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

Si desea escribir usted mismo, usted debe considerar aprovechando el hecho de que ambas gamas ya están ordenados, por lo que podemos hacer mejor que una búsqueda plana de existencia avanzando dos iteradores en paralelo.

Si usted no tiene C++ 11, sólo tiene que utilizar este predicado en lugar de la lambda:

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

Cuidado con que no hay comparación del tipo de mapeado! Entonces, si tiene la misma clave de cadena en ambos mapas, entonces no habrá tal elemento en el resultado, incluso si los dos valores asignados difieren. Si esto no es deseable, necesita un contenedor de salida diferente (por ejemplo, un std::multimap<my_map::key_type, my_map::mapped_type>) y un predicado diferente.

Cuestiones relacionadas