c++ - 使用标准算法从容器中移除对象

标签 c++ c++11 lambda stl-algorithm

假设我有一个 std::unordered_set 存储类 A 的对象。现在我想删除满足给定 condition 的对象子集,并将另一个函数应用于子集中的每个对象。执行此操作的最佳(或优雅)方法是什么?

一个可能的解决方案是:

std::unordered_set<A> myset;

//.. initialize data

std::for_each(myset.begin(), myset.end(), [](A&) { if(condition(A)) { /*do something on A*/} });

auto itrs = std::remove_if(myset.begin(), myset.end(), [](A&) {return condition(A)});
myset.erase(itrs, myset.end());

显然上述解决方案需要两步函数调用。有什么办法可以简化这个吗?

最佳答案

首先编写一个算法,根据关联容器中的谓词进行删除(删除/删除 - 如果对 unordered_set 不起作用):

template <class Container, class Predicate>
void erase_if(Container& c, Predicate pred)
{
    using std::begin;
    using std::end;

    auto first = begin(c);
    auto last = end(c);
    while (first != last) {
        if (pred(*first)) {
            first = c.erase(first);
        }
        else {
            ++first;
        }
    }
}

然后只需传入一个谓词来检查您的条件,然后执行一些操作:

erase_if(myset, [](A const& a) {
    if (condition(a)) {
        /* do something */
        return true;
    }
    return false;
});

关于c++ - 使用标准算法从容器中移除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38925182/

相关文章:

ios - 如何通过 iOS SDK 调用 Lambda 函数?

c++ - C++如何知道如何转换为特定类型?

c++ - 在另一个线程上向 QObject 发出信号的正确方法?

c++ - 何时调用 C++ 析构函数?

c++ - char 数组的 cin 和 cin.get() 之间的区别

java - Arrays.sort 使用 Lambda 然后比较

c++ - 基类没有新方法报错

c++ - std::map 的比较器函数中的段错误/未定义行为

c++ - MinGW 不将从模板类继承为模板

C# 表达式转换为派生类型