2014-10-02 4 views
0

벡터의 모든 요소에 논리 조건을 적용하는 while 루프가 있어야합니다. (3 모든 요소! =)전체 벡터에 조건 적용

I 생각할 수있는 유일한 방법은 물품

예컨대, 동안 (모든 요소 < 3) 동안이다 (벡터 [1]! = 3 || 벡터 [2- 반면 ]! = 3 || ...). 내 벡터가 크면 빨리 커질 것입니다.

C++에서 더 좋은 방법이 있습니까?

+1

이 검사를 자주 수행하는 경우 벡터 정렬을 항상 유지하거나 벡터의 최대 요소를 추적하는 것과 같은 몇 가지 대안을 살펴볼 수 있습니다. 그러면 O (N) 대신이 체크 O (1)이됩니다. –

답변

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) 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))) 
{ 

} 
+0

감사! 전 C++ 11을 요청할 것입니다. – holianoify

+0

작동하지 않습니다 ... all_of가 C++ 인 것처럼 보입니다 – holianoify

+0

@holianoify & Galik은 미안하다고 생각하지 않았습니다. 템플릿 구현본을 복사했습니다. – P0W

0

, 대답은 본질적으로 함께 std::all을 사용하고 있습니다 람다 :

if (std :: all (v.begin(), v.end(), [] (const typename std :: decay :: type &) {return a < 3; }) * /} C++ 03에서

, 당신은 운동 표준 : 모든과 람다에있는 {7 * 여기에 당신의 재료 :

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 */ } 

,

이 경우 당신이 모호한 모든 functinal 기계 찾을 수 (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; 
} 

, 코드가 배열 되더라도, 모든 것은 검색된 조건의 부정에 대해 거짓으로 깨는 루프로 귀결됩니다.

물론

, 모든 수치 비교하면, !(<)>=하고 !(==)!=이지만, 계속하고 발은 <를 사용하여 템플릿 매개 변수, 그리고 == 결과는 발 구현을위한 작은 요구 사항 (해당 될 수 있습니다 아무것도하지 않기 때문에 그냥 int)

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 (종종 람다가 있지만).