2012-11-20 2 views
3

과 함께 lower_bound을 호출하는 방법을 알 수 없습니다.zip_iterator 및 lower_bound

이 컴파일되지 않습니다 :

#include <boost/iterator/zip_iterator.hpp> 
#include <vector> 
#include <algorithm> 

void main() 
{ 
    typedef int Key; 
    typedef double Value; 

    typedef boost::tuple<typename std::vector<Key>::iterator, 
         typename std::vector<Value>::iterator> the_iterator_tuple; 
    typedef boost::zip_iterator<the_iterator_tuple> the_zip_iterator; 

    std::vector<Key> keys_; 
    std::vector<Value> values_; 

    // Add values to keys_ and values_... 

    auto it = std::lower_bound(
     the_zip_iterator(the_iterator_tuple(keys_.begin(), values_.begin())), 
     the_zip_iterator(the_iterator_tuple(keys_.end(), values_.end())), 
     123, 
     [](const the_iterator_tuple & it, const int v) -> bool { return *boost::get<0>(it) < v; } 
    ); 

    // Use "it"... 
} 

를 VS2010는이를 위해 (플러스 수십 다른 일 " 'const를 표준 : _ Vector_iterator < _Myvec이> &를'에 'INT'에서 매개 변수 1 변환 할 수 없습니다"라는 같은 에러). 그러나 주어진 람다가 아니라 애매한 boost :: tuple 생성자와 관련이있다. 내가 잘못 뭐하는 거지

?

답변

2

std::lower_bound(it, end, v)*it < vv < *it을 모두 수행 할 수 있어야합니다. 함수 객체는 이들 중 하나만 지원합니다.

위의 진술을 남겨두고 이에 대한 의견이 있기 때문에 : 이것은 사실이 아닙니다. 하워드 (Howard)가 지적했듯이, 비교는 comp(*it, v)을 사용해야한다. 즉,이 연산이 대칭 일 필요는 없다.

그러나 boost::zip_iterator<It0, It1>의 설명서를 보면 *itboost::tuple<typename It0::reference, typename It1::reference>으로 나타납니다. 따라서, typedef

typedef boost::tuple<typename std::vector<Key>::reference, 
        typename std::vector<Value>::reference> the_reference_tuple; 

추가 ... 및

[](the_reference_tuple const& it, int v) { return it.get<0>() < v; } 

는 GCC와 연타하여 컴파일 문제가 해결 될 람다 변경.

+0

아니요. 그냥 그것을 시도했는지 확인하십시오. 이 compiels 잘 :'std :: vector > ok; auto it = std :: lower_bound (ok.begin(), ok.end(), 123, [] (const std :: pair & p, const int v) -> bool {return p.first Gabriel

3

이것은 VS2010의 "개념 검사"버그처럼 보입니다.

25.4.3.1 [lower.bound]/P1 :

가 필요 :: e[first,last)의 요소는 식 e < value 또는 comp(e, value) 에 대하여 분배한다.

.l.e. *it < v 만 필요합니다.

upper_bound 알고리즘의 반대 요구 사항은 v < *it입니다. equal_range 두식이 모두 작동해야합니다.