是否有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;
}
答案 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时效率低。对输入迭代器不起作用。