将条件应用于整个向量

时间:2014-10-02 06:14:08

标签: c++ c++03

我需要一个while循环,将逻辑条件应用于向量的每个元素。

例如,while(所有元素< 3)或while(所有元素!= 3)

我能想到的唯一方法就是写(vector [1]!= 3 || vector [2]!= 3 || ...)。如果我的矢量很大,那很快就会增长。

在C ++中有更好的方法吗?

3 个答案:

答案 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)。