12

これを実現するには、いくつかの比較機能を含める必要があることを知っています。

しかし、これについては書くことができません。

例えば:

ベクトルの要素={(2,4),(4,2),(5,1),(5,3)}

見つける=5

lower_bound() は 2 を返す必要があります

コード->

#define pp pair<int,int>

bool cmp(const pp &l,const pp &r) {
    return l.first < r.first;
}

int main() {
   vector<pp> v;
   sort(v.begin(), v.end(), cmp);
   int id=(int)(lower_bound(v.begin(), v.end(), ??) - v.begin());
}
4

4 に答える 4

14

ペア(ちょうどタプルのように) はとにかく辞書的に比較します。このために特別なコンパレーターを定義する必要はありません

そして、あなたが使用しているのでlower_bound、あなたが検索しているよりも少なく比較しない最初の要素を検索するので、2番目のペア要素として値をval使用する必要があります. min要約すると、すべて「2」行のコードで実行できます

sort(v.begin(),v.end());
auto id = distance(v.begin(), lower_bound(v.begin(),v.end(), 
       make_pair(5, numeric_limits<int>::min())) );

いくつかのメモ:

  1. std::distance2 つのイテレータ間の要素数を計算するために使用します
  2. の戻り値の型std::distanceは unsigned 型です。負のインデックス (Python のような「最後から数えて」インデックスの構文) が必要でない限り、インデックスを無署名のままにしておくことをお勧めします。
于 2014-06-01T17:25:26.797 に答える
7

の 2 番目の値は気にしないので、任意の値を 2 番目の要素としてpp一時ppオブジェクトを作成するだけです。

int id = std::lower_bound(v.begin(), v.end(), pp(5, 0), cmp) - v.begin();
于 2014-06-01T15:22:03.607 に答える
3

lower_bound の定義に従ってペアを比較する必要があると思います

   typedef pair<int,int> pp;
   //...

   int id=(int)(lower_bound(v.begin(),v.end(), 
                pp(5,std::numeric_limits<int>::min())), //Value to compare
                [](const pp& lhs, const pp& rhs)       // Lambda
                {
                    return lhs < rhs ;                //  first argument < second
                }
                 ) - v.begin()
               );
于 2014-06-01T15:31:34.903 に答える