是否有STL / boost算法来检查容器中的所有元素是否匹配值?

时间:2010-11-19 12:38:12

标签: c++ algorithm boost stl

是否有STL / boost算法测试两个迭代器之间的所有元素是否匹配给定值?或者谓词为所有这些都返回true

即。

之类的东西
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;
}

5 个答案:

答案 0 :(得分:22)

如果可以否定谓词,可以使用std :: find / 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) );

答案 1 :(得分:18)

C ++ 0x引入std::all_of

答案 2 :(得分:2)

您可以使用std:find 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");

答案 3 :(得分: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;
}

答案 4 :(得分: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时效率低。对输入迭代器不起作用。