I\'ve got a container and would like to erase elements based on a predicate. erase_if
sounds familiar, but I can\'t find it in C++. What\'s the name and where i
MSVC does not yet implement C++20's std::erase_if
from P1209R0 so, as a workaround, you can just copy the implementation for specific container from that paper somewhere to your code. GCC 9.1 and Clang 9.0 already have it.
namespace std {
// for std::string
template
void erase_if(basic_string& c, Predicate pred) {
c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}
// for std::deque
template
void erase_if(deque& c, Predicate pred) {
c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}
// for std::vector
template
void erase_if(vector& c, Predicate pred) {
c.erase(remove_if(c.begin(), c.end(), pred), c.end());
}
// for std::list
template
void erase_if(list& c, Predicate pred) {
c.remove_if(pred);
}
// for std::forward_list
template
void erase_if(forward_list& c, Predicate pred) {
c.remove_if(pred);
}
// for std::map
template
void erase_if(map& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::multimap
template
void erase_if(multimap& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::set
template
void erase_if(set& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::multiset
template
void erase_if(multiset& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::unordered_map
template
void erase_if(unordered_map& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::unordered_multimap
template
void erase_if(unordered_multimap& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::unordered_set
template
void erase_if(unordered_set& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
// for std::unordered_multiset
template
void erase_if(unordered_multiset& c, Predicate pred) {
for (auto i = c.begin(), last = c.end(); i != last; )
if (pred(*i))
i = c.erase(i);
else
++i;
}
} // namespace std