remove_if эквивалентно для std :: map - PullRequest
105 голосов
/ 29 апреля 2009

Я пытался стереть ряд элементов с карты в зависимости от конкретного условия. Как мне это сделать с использованием алгоритмов STL?

Изначально я думал об использовании remove_if, но это невозможно, так как remove_if не работает для ассоциативного контейнера.

Существует ли какой-либо эквивалентный алгоритм "remove_if", который работает для карты?

Как простой вариант, я подумал о том, чтобы пройтись по карте и стереть. Но проходит ли циклически по карте и стирает безопасный вариант? (Поскольку итераторы становятся недействительными после стирания)

Я использовал следующий пример:

bool predicate(const std::pair<int,std::string>& x)
{
    return x.first > 2;
}

int main(void) 
{

    std::map<int, std::string> aMap;

    aMap[2] = "two";
    aMap[3] = "three";
    aMap[4] = "four";
    aMap[5] = "five";
    aMap[6] = "six";

//      does not work, an error
//  std::remove_if(aMap.begin(), aMap.end(), predicate);

    std::map<int, std::string>::iterator iter = aMap.begin();
    std::map<int, std::string>::iterator endIter = aMap.end();

    for(; iter != endIter; ++iter)
    {
            if(Some Condition)
            {
                            // is it safe ?
                aMap.erase(iter++);
            }
    }

    return 0;
}

Ответы [ 12 ]

0 голосов
/ 10 августа 2011

Если вы хотите стереть все элементы с ключом больше 2, тогда лучший способ -

map.erase(map.upper_bound(2), map.end());

Работает только для диапазонов, но не для предикатов.

0 голосов
/ 25 мая 2009

Ответ Стива Фолли Я чувствую себя более эффективным.

Вот еще одно простое, но менее эффективное решение :

Решение использует remove_copy_if для копирования значений, которые мы хотим, в новый контейнер, а затем заменяет содержимое исходного контейнера на новый:

std::map<int, std::string> aMap;

...
//Temporary map to hold the unremoved elements
std::map<int, std::string> aTempMap;

//copy unremoved values from aMap to aTempMap
std::remove_copy_if(aMap.begin(), aMap.end(), 
                    inserter(aTempMap, aTempMap.end()),
                    predicate);

//Swap the contents of aMap and aTempMap
aMap.swap(aTempMap);
...