C++ std::set::erase z std::remove_if

C++ std::set::erase z std::remove_if

Nie możesz użyć std::remove_if() z sekwencjami, które mają const Części. Sekwencja std::set<T> elementy składają się z T const przedmioty. Właściwie omówiliśmy to pytanie zaledwie wczoraj na standardowym komitecie C++ i jest pewne wsparcie dla tworzenia algorytmów zajmujących się konkretnie erase() obiektów z kontenerów. Wyglądałoby to mniej więcej tak (patrz też N4009):

template <class T, class Comp, class Alloc, class Predicate>
void discard_if(std::set<T, Comp, Alloc>& c, Predicate pred) {
    for (auto it{c.begin()}, end{c.end()}; it != end; ) {
        if (pred(*it)) {
            it = c.erase(it);
        }
        else {
            ++it;
        }
    }
}

(prawdopodobnie faktycznie delegowałby to algorytm wysyłający do powyższej logiki, ponieważ ta sama logika jest taka sama dla innych kontenerów opartych na węzłach).

Do konkretnego zastosowania możesz użyć

a.erase(10);

ale działa to tylko wtedy, gdy chcesz usunąć klucz, podczas gdy powyższy algorytm działa z arbitralnymi predykatami. Z drugiej strony a.erase(10) może skorzystać z std::set<int> 's struktury i będzie O(log N), podczas gdy algorytm jest O(N) (z N == s.size() ).


std::remove_if zmienia kolejność elementów, więc nie można jej używać z std::set . Ale możesz użyć std::set::erase :

std::set<int> a;
a.erase(10);