3

lower_boundで呼び出す方法がわかりませんzip_iterator

これはコンパイルされません:

#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 を 'int' から 'const std::_Vector_iterator<_Myvec> &' に変換できません」(さらに、同じエラーのために数十個の他のもの) と言っていますが、あいまいな boost::tuple コンストラクターと関係があります。 、指定されたラムダではありません。

私は何を間違っていますか?

4

2 に答える 2

3

これは、VS2010 の「概念チェック」バグのようです。

25.4.3.1 [下界]/p1:

Requires:: の要素eは、式or[first,last)に関して分割されます。e < valuecomp(e, value)

つまり、必要なだけ*it < vです。

upper_boundアルゴリズムには反対の要件があります : v < *it. またequal_range、両方の式が機能する必要があります。

于 2012-11-20T20:24:57.793 に答える