2011-07-13 2 views
0

J'ai un std::map<boost::shared_ptr<some_class>, class_description> class_map;class_description est:Comment mettre à jour une telle structure de carte?

//Each service provides us with rules 
struct class_description 
{ 
    //A service must have 
    std::string name; 
      // lots of other stuff... 
}; 

et j'ai une autre std::map<boost::shared_ptr<some_class>, class_description> class_map_new;

J'ai besoin d'insérer des paires <boost::shared_ptr<some_class>, class_description>class_map_new-class_map dans le cas où il n'y avait pas class_description avec une telle name dans class_map avant. Comment faire une telle chose?

+0

Semble facile - qu'avez-vous essayé, et comment cela n'a-t-il pas fonctionné? Code + erreurs de compilation ou problème d'exécution s'il vous plaît .... –

Répondre

1

std::map::insert ne permet pas de doublons, de sorte que vous pouvez simplement essayer d'insérer les nouvelles valeurs:

//Each service provides us with rules 
struct class_description 
{ 
    //A service must have 
    std::string name; 
    // lots of other stuff... 
}; 

std::map<boost::shared_ptr<some_class>, class_description> class_map; 
std::map<boost::shared_ptr<some_class>, class_description> class_map_new; 

// insert the new values into the class_map 
// using C++0x for simplicity... 
for(auto new_obj = class_map_new.cbegin(), end = class_map_new.cend(); 
    new_obj != end; ++new_obj) 
{ 
    auto ins_result = class_map.insert(*new_obj); 

    if(false == ins_result.second) 
    { 
     // object was already present, 
     // ins_result.first holds the iterator 
     // to the current object 
    } 
    else 
    { 
     // object was successfully inserted 
    } 
} 
1

Ce que vous voulez est un « stl comme » algorithme pour copy_if. Il n'y en a pas, mais vous pouvez probablement trouver un exemple sur le web ou écrire le vôtre en regardant le code de count_if et remove_copy_if.

+0

Notez que 'std :: copy_if' _is_ en C++ 0x. – ildjarn

Questions connexes