2016-08-12 19 views
1

Aのオブジェクトを格納するstd::unordered_setがあるとします。ここでは、与えられたconditionを満たすオブジェクトのサブセットを削除し、サブセット内の各オブジェクトに別の関数を適用したいと考えています。これを行うための最良の(またはエレガントな)方法は何ですか?stdアルゴリズムを使用してコンテナからオブジェクトを削除する

一つの可能​​な解決策は、することができます:

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()); 

明らかに上記の溶液は、2段階の関数呼び出しが必要です。これを単純化する方法はありますか?

+0

私はあなたのものを 'remove_if'の述語で行うことを提案しようとしていました。しかし、あなたはできません。とても簡単だったでしょうか... –

答えて

4

スタート連想コンテナからの述語に基づいて消去するためのアルゴリズムを書いて(消去/削除-場合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; 
}); 
関連する問題