Как обновить такую ​​структуру карты? - PullRequest
0 голосов
/ 13 июля 2011

У меня есть std::map<boost::shared_ptr<some_class>, class_description> class_map;, где class_description:

//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_new;

Мне нужно вставить пары <boost::shared_ptr<some_class>, class_description> от class_map_new до class_map на случай, если не было class_description с такими name в class_map ранее. Как это сделать?

Ответы [ 2 ]

1 голос
/ 13 июля 2011

То, что вы хотите, это "stl-подобный" алгоритм для copy_if.Там нет ни одного, но вы, вероятно, можете найти пример в Интернете или написать свой собственный, посмотрев код для count_if и remove_copy_if.

1 голос
/ 13 июля 2011

std::map::insert не допускает дублирования, поэтому вы можете просто попытаться вставить новые значения:

//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
    }
}
...