Как стереть элементы на карте с помощью ключей элементов в наборе? - PullRequest
2 голосов
/ 01 июня 2011

У меня есть набор ключей, которые я хочу удалить на карте. Я попробовал удар по коду, но он не скомпилировался.

std::set<std::string> keys;
std::map<std::string, std::string> mymap;
....
for_each(keys.begin(), keys.end(), boost::bind(&std::map<std::string,   
                                               std::string>::erase, 
                                               &mymap, _1));

1 Ответ

7 голосов
/ 01 июня 2011

Вы не можете получить адрес функции-члена стандартной библиотеки, потому что объявления таких функций-членов не определены (в реализации разрешено добавлять дополнительные, необязательные параметры или добавлять дополнительные перегрузки в другие не перегруженные функции-члены, если толькоповедение такое же).

Самый простой способ сделать то, что вы пытаетесь сделать, это:

for (std::set<std::string>::iterator it(keys.begin()); it != keys.end(); ++it)
{
    mymap.erase(*it);
}

Если у вас есть компилятор, который поддерживает лямбда-выражения, вы также можете подумать:

std::for_each(keys.begin(), keys.end(), [&mymap](const std::string& key)
{
    mymap.erase(key);
});

Если по какой-то причине вы действительно хотите использовать bind, вам нужно написать функциональный объект для вызова erase:

struct assoc_erase
{
    typedef void result_type;

    template <typename TContainer, typename TKey>
    void operator()(TContainer* container, const TKey& key)
    {
        container->erase(key);
    }
};

// Used as:
std::for_each(keys.begin(), keys.end(), std::bind(assoc_erase(), &mymap, _1));
...