2012-11-20 67 views
3

我不知道如何調用lower_boundzip_iteratorzip_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說, 「不能從 '詮釋' 轉換參數1 '常量的std :: _ Vector_iterator < _Myvec> &'」(加幾十個其他的事情了相同的錯誤),但是它與一個不明確的boost :: tuple構造函數有關,而與給定的lambda沒有關係。

我在做什麼錯?

回答

2

std::lower_bound(it, end, v)需要能夠做到*it < vv < *it。你的函數對象只支持其中之一。

由於對此有評論,因此留下上述說明:情況並非如此。正如霍華德指出的那樣,比較需要使用comp(*it, v),即不需要這個操作是對稱的。

但是,查看boost::zip_iterator<It0, It1>的文檔,似乎*it產生boost::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 < valuecomp(e, value)進行分區。

I.e.只需要*it < v即可。

upper_bound算法有相反的要求:v < *it。並且equal_range需要這兩個表達式才能工作。