2010-11-19 8 views
15

2つのイテレータ間のすべての要素が特定の値と一致するかどうかをテストするSTL /ブーストアルゴリズムはありますか?あるいは、述語がすべてtrueを返しますか?コンテナ内のすべての要素が値と一致することを確認するSTL /ブーストアルゴリズムはありますか?

template<class InputIterator, class T> 
InputIterator all_match (InputIterator first, InputIterator last, const T& value) 
{ 
    bool allMatch = true; 
    while(allMatch && first!=last) 
     allMatch = (value == *first++); 
    return allMatch; 
} 

それとも

template <class InputIterator, class Predicate> 
bool all_true (InputIterator first, InputIterator last, Predicate pred) 
{ 
    bool allTrue = true; 
    while (allTrue && first != last) 
     allTrue = pred(*first++); 
    return allTrue; 
} 

答えて

22

あなたがSTDを使用することができ述語を否定することができた場合は::/STD :: find_ifを見つけて、それはあなたのシーケンスの最後の要素を返すかどうかを確認します。そうでなければ、一致するものを返します。

関数をstd :: not1またはstd :: not_equal_toで適合させることができます。したがって、std :: find_ifと組み合わせることで、実際にループを作成せずにSTLを使用することができます。

bool allMatch = seq.end() == std::find_if(seq.begin(), seq.end(), 
    std::not_equal_to(val)); 
bool allPass = seq.end() == std::find_if(seq.begin(), seq.end(), 
    std::not1(pred)); 
+0

それはうまくいくでしょう。ありがとう。 – GrahamS

+4

実際、私は 'not_equal_to()'の構文がかなり正しいとは思わない。私は何か間違っているかもしれませんが、 'std :: not_equal_to ()のように' std :: find_if(seq.begin()、seq.end()、std :: bind2nd() 、val)) ' – GrahamS

2

よう

すなわち、何かあなたがSTDを使用することができます見つけるORDのstd :: find_ifこれを行うには。

template <class T> 
struct pred { 
    T t_; 

    pred(const T& value) : t_(value) {} 

    bool operator()(const T &t) 
    { 
     return t != t_; 
    } 
}; 

if (e.cend() == std::find_if(c.cbegin(), c.cend(), pred<T>(value))) 
    print("all match value"); 
+0

私が理解しているように、findとfind_ifはコンテナ内の最初の一致のみを見つけます。私はイテレータ間のすべての要素が所定の値であることを確認したい。 – GrahamS

+0

私の編集はどのように動作するはずですか? – frast

+0

申し訳ありませんが、私の述語はworngでした。私は今それを修正しました。 – frast

2

述語にstd::equalを使用できます。何かのように:

using namespace std; 
using namespace boost::lambda; 

int main() 
{ 
    vector<int> a; 
    a.push_back(1); 
    a.push_back(1); 
    a.push_back(2); 
    a.push_back(2); 
    a.push_back(3); 
    bool allMatch = equal(a.begin(), a.begin() + 2, a.begin(), _1 == 1); 
    return 0; 
} 
18

C++ 0xはstd::all_ofを紹介します。

+0

@avakar:Section 25.1 [algorithms.general]' std :: any_of'と 'std :: none_of'(そして悪名高い' std :: copy_if')も紹介しています。 –

+0

@avakar:C++ 0xは使用していませんが、とにかく知っておくと便利です。ありがとうございます。 – GrahamS

+0

これは面白いです。これは、C++ 0xがより人間的なインタフェースに移行していることを示しています。 – wilhelmtell

1

多くの場合、あなたはちょうどそれらを数えることができます。

template<class FwdIterator, class T> 
InputIterator all_match (FwdIterator first, FwdIterator last, const T& value) 
{ 
    return std::count(first, last, value) == std::distance(first, last); 
} 

非効率なイテレータがランダムでない場合、またはそれがfalseを返したとき。入力イテレータでは機能しません。

+0

また、それは非常に大きな容器には理想的ではない不一致を見つけるとすぐに停止しません。 – GrahamS

関連する問題