C++ STL设置lower_bound错误结果

Adi*_*aru 2 c++ algorithm stl function lower-bound

我对lower_bound比较函数有一些问题.

我有一对由该对的第二个值排序的对,我试着通过一个值从这个集合中获取lower_bound.

我目前的代码是:

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

struct setCompareFunctor
{
    bool operator( )( const pair< int, int > &lhs, const pair< int, int > &rhs ) const
    {
        return( lhs.second <= rhs.second );
    }
};

struct setCompareFunctorAux
{
    bool operator( )( const pair< int, int > &lhs, const pair< int, int > &rhs ) const
    {
        return( lhs.second <= rhs.second );
    }

    bool operator( )( const pair< int, int > &lhs, int val ) const
    {
        return( lhs.second <= val );
    }

    bool operator( )( int val, const pair< int, int > &rhs ) const
    {
        return( val <= rhs.second );
    }
};


int main( )
{
    set< pair< int, int >, setCompareFunctor > submultimi;

    submultimi.insert( make_pair( 1, 15 ) );
    submultimi.insert( make_pair( 2, 9 ) );
    submultimi.insert( make_pair( 3, 33 ) );
    submultimi.insert( make_pair( 4, 44 ) );
    submultimi.insert( make_pair( 5, 20 ) );
    submultimi.insert( make_pair( 6, 15 ) );

    set< pair< int, int >, setCompareFunctor >::iterator it = lower_bound( submultimi.begin( ), submultimi.end( ), 20, setCompareFunctorAux( ) );


    cout << ( *it ).second << endl;


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期结果是15,但实际结果是33.

怎么了 ?

gsa*_*ras 5

预期结果是15,但实际结果是33.

不,预期的结果是20,因为函数"返回指向范围[first,last]中的第一个元素的迭代器,它不会比val小.",正如您可以在std::lower_bound参考中读到的那样.

你不会得到这个结果,因为你使用<=而不是<在你的setCompareFunctorAux结构中.

结果,当你搜索20时,它会从平等中感到困惑,并在搜索时走向错误的方向.


PS:与您的问题无关,但setCompareFunctor不是有效的比较器,因为它不满足严格的弱排序.为了做到这一点,只需<=改为<.阅读更多运算符<和严格的弱排序.