我需要一个while循环,将逻辑条件应用于向量的每个元素。
例如,while(所有元素< 3)或while(所有元素!= 3)
我能想到的唯一方法就是写(vector [1]!= 3 || vector [2]!= 3 || ...)。如果我的矢量很大,那很快就会增长。
在C ++中有更好的方法吗?
答案 0 :(得分:3)
请参阅std::all_of
假设
std::vector<int> v;
if(std::all_of(v.cbegin(), v.cend(), [](int i){ return i < 3 }))
{
}
if(std::all_of(v.cbegin(), v.cend(), [](int i){ return i != 3 }))
{
}
预C ++ 11
struct Check
{
int d;
Check(int n) : d(n) {}
bool operator()(int n) const
{ return n < d; }
};
// Copied from above link
template< class InputIt, class UnaryPredicate >
bool all_of(InputIt first, InputIt last, UnaryPredicate p)
{
for (; first != last; ++first) {
if (!p(*first)) {
return false;
}
}
return true ;
}
if( all_of(v.begin(), v.end(), Check(3) ))
{
}
答案 1 :(得分:0)
在C ++ 11中,答案主要是将std::all
与lambdas一起使用:
if(std :: all(v.begin(),v.end(),[](const typename std :: decay :: type&amp; a) {返回&lt; 3; }) {7 *你的东西在这里* /}
在C ++ 03中,你必须锻炼std :: all和lambdas:
template<class Iter, Fn>
bool all(Iter i, Iter end, Fn fn)
{
for(;i!=end; ++i)
if(!fn(*i)) return false;
return true;
}
和<3
你需要一个明确的类,如
class is_less_than_val
{
int val;
public:
is_less_than(int value) :val(value) {}
bool operator()(int var) const { return var<val; }
};
这样你就可以写
了if(all(v.begin(),v.end(),is_less_than_val(3))
{ /* your stuff here */ }
如果你发现所有的功能机制都很模糊(C ++ 03不那么“简单”,没有实质的类型推论),而且更喜欢更程序化的方法,
template<class Cont, class Val>
bool all_less_than(const Cont& c, const Val& v)
{
for(typename Cont::const_iterator i=c.cbegin(), i!=c.end(); ++i)
if(!(*i < v)) return false;
return true;
}
template<class Cont, class Val>
bool all_equal_to(const Cont& c, const Val& v)
{
for(typename Cont::const_iterator i=c.cbegin(), i!=c.end(); ++i)
if(!(*i == v)) return false;
return true;
}
在所有的样本中,无论代码是如何安排的,一切都归结为一个循环,在对搜索条件的否定时,它会被打破为假。
当然,如果所有都是数字比较,!(<)
为>=
而!(==)
为!=
,但由于Cont和Val是模板参数,因此仅使用&lt;和==结果对Val实现的要求较少(可以是任何事情,而不仅仅是int
)
答案 2 :(得分:0)
正如其他人所说,在C ++ 11中,有特殊的功能
这个。在预C ++ 11中,通常的习惯用法会涉及到
std::find_if
,并与结束迭代器进行比较
结果,例如:
struct Condition
{
// The condition here must be inversed, since we're looking for elements
// which don't meet it.
bool operator()( int value ) const { return !(value < 3); }
};
// ...
while ( std::find_if( v.begin(), v.end(), Condition() ) == v.end() ) {
// ...
}
这是我在C ++ 11中继续使用它的常用习惯用法 (虽然经常使用lambda)。