2014-02-12 2 views
1

2 valarrays를 비교하는 편리하고 최적화 된 방법을 찾고 있습니다. 그 부스트 다소 것을 지원 보았다 : /boost/accumulators/numeric/functional/valarray.hpp에서C++ Boost valarray

-

// for "promoting" a std::valarray<bool> to a bool, useful for 
// comparing 2 valarrays for equality: 
// if(numeric::promote<bool>(a == b)) 
template<typename From> 
struct promote<bool, From, void, std_valarray_tag> 
: std::unary_function<From, bool> { 
    bool operator()(From &arr) const { 
     BOOST_MPL_ASSERT((is_same<bool, typename From::value_type>)); 
     for(std::size_t i = 0, size = arr.size(); i != size; ++i) { 
      if(!arr[i]) { 
       return false; 
      } 
     } 
     return true; 
    } 
}; 

다음 사소한 코드 std::valarray으로 실행 :

#include <valarray> 
typedef std::valarray<int> valarray_t; 

int main(void) { 
    int arr_length = 30; int num_of_idx = 5; 
    // initialize arr 
    int* arr = new int[arr_length]; 
    for (int i=0; i<arr_length; i++) 
     arr[i] = i; 
    // Create a valarray of ints. 
    valarray_t vi(arr, arr_length); 
    std::valarray<bool> aaa = (vi == vi); 
} 

부스트를 사용하여 aaa이 모두 사실인지 어떻게 확인할 수 있습니까?

감사합니다. 당신의 인용 코드

답변

3

코멘트는 정확하게 말한다 :

bool allTrue = boost::numeric::promote<bool>(aaa); 

하거나 C++ 11의 표준 라이브러리 : 귀하의 빠른 회신 아르네에 대한

bool allTrue = std::all_of(begin(aaa), end(aaa), [](bool b){return b;}); 
+0

감사합니다! C++ 11 버전은 훌륭하게 작동합니다 - 감사합니다! 부스트 버전은 컴파일하지만 boost :: mpl :: if_ >, bool & bool> :: :: boost :: numeric :: promote > (std :: valarray &) ' collect2 : 오류 : ld가 1 종료 상태를 반환했습니다. 더 효율적인 코드로 변환 할 수있는 아이디어가 있습니까? –

+1

@LironCohen 두 버전 모두 성능면에서 거의 같아야한다고 생각합니다. 링커 오류의 경우'valarray.hpp '다음에'boost/accumulators/numeric/functional.hpp' *를 명시 적으로 포함시켜야합니다. http://coliru.stacked-crooked.com/a/56616329db200d43 –