如何巧妙地将一些元素从std :: set移动到另一个容器?

Vio*_*ffe 2 c++ algorithm stl

由于迭代器在删除操作时无效,如何使用最少量的代码迭代所有元素std::set,删除其中的一些元素?

Jam*_*lis 6

// Filters the elements of a set:  elements that satisfy the predicate 'pred'
// are removed from the source set and inserted into the output.
template <typename TSet, typename TOutputIterator, typename TPredicate>
void extract_if(TSet& s, TOutputIterator out, TPredicate pred)
{
    for (typename TSet::iterator it(s.begin()); it != s.end();)
    {
        if (pred(*it))
        {
            *out++ = *it;
            it = s.erase(it);
        }
        else
        {
            ++it;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @DrewHall:是的,看起来`erase()`在C++ 98/C++ 03中返回`void`.所以,如果在这种情况下找到自己,他应该解决它,例如`iterator current(it); ++它; s.erase(电流);` (3认同)