6

次のベクトル{101010 20 20 20 30 30}があり、たとえば11を検索している場合のように、Xである整数の位置、またはXの直後の小さい要素を返す関数が必要な場合2番目の要素(10)は、ベクトルの11よりも小さい最初の要素であるため、2を返す関数。
lower_boundを使用してみましたが、機能しません。

int myints[] = {10,20,30,30,20,10,10,20};
vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
vector<int>::iterator low,up;

sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

low=lower_bound (v.begin(), v.end(), 11); //
up= upper_bound (v.begin(), v.end(), 11); //

cout << "lower_bound at position " << int(low- v.begin()) << endl;
cout << "upper_bound at position " << int(up - v.begin()) << endl;

return 0;

このコードは以下を出力します:

lower_bound at position 3
upper_bound at position 3
4

5 に答える 5

10

cppreference は私にそれを知らせますstd::lower_bound

値以上の範囲 [first, last) 内の最初の要素を指す反復子を返します。

std::upper_bound

[first, last) の範囲内で value より大きい最初の要素を指す反復子を返します。

この場合、 I を含むベクトルが与えられた場合、10 10 10 20 20 20 30 30両方の関数が最初の を指すことが期待され20ます。これは、ベクトル内の位置 3 にあり、実際に両方の時間で得られた結果です。代わりに を要求した場合20、ベクトルstd::lower_boundの最初 (位置 3) を指す反復子が返されます... 最初の数値は 20 以上で、 を要求したときに得られるのと同じ結果になります。ただし、この場合、20 より大きい最初の値である最初の値 (位置 6) を指すイテレータを返します。2011std::upper_bound30

イテレータを 1 つ後ろに移動して、最後の値を目標数よりも小さくするのstd::prevが 1 つの方法です。

于 2012-11-15T14:18:26.200 に答える
3

テスト項目よりも大きい最初の項目をupper_bound返すので、その前の項目 (存在する場合) が必要な項目になりますか?

于 2012-11-15T14:17:24.223 に答える
0

あなたはこれを行うことができます...ベクトルが空の場合に備えてイテレータを返す方が良いかもしれません...

auto find_next_smaller(vector<int> vec, const int x) { 
    std::sort(vec.begin(), vec.end());
    auto it = std::lower_bound(vec.begin(), vec.end(), x); 
    if (it == vec.end()) { 
      it = (vec.rbegin()+1).base();
    }
    else if (it != vec.begin() && *it > x) { 
        --it; 
    }

    return it; 
} 
于 2015-03-14T13:13:32.290 に答える