std :: set_difference можно ли сравнивать набор и сопоставление ключей? - PullRequest
2 голосов
/ 13 октября 2011

Таким образом, мы получаем новый набор строк, и у нас есть один как ключи карты. И мы хотим сделать one way set_difference (примечание - не set_symmetric_difference). Так что в настоящее время у меня есть такой уродливый код, как:

    std::map<std::string, boost::shared_ptr<some_class> > _ds;
std::set<std::string> compare_and_clean(std::set<std::string> &new_)
{
    std::set<std::string> result;
    std::set<std::string> old;

    for (std::map<std::string, std::string>::iterator mi = _ds.begin(); mi != _ds.end(); ++mi)
        old.insert(mi->first);

    std::set_difference( old.begin(), old.end(), new_.begin(), new_.end(), inserter(result, result.begin()));

    for (std::set<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
        _ds.erase(*i);
    }
    return result;
}

Интересно, как сделать set_difference над ключами карты и установить более чистый способ?

1 Ответ

2 голосов
/ 13 октября 2011

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

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

...