2016-10-09 4 views
1

C++初心者ここ!並べ替えられたベクトルv(一意でない値を持つ)とスカラーxがある場合、どのようにバイナリ検索を実行して、xと等しいか小さい要素の位置を返すことができます。値のちょうど小さい要素の位置のバイナリ検索

std::vector<double> v { 0.9,0.78,0.6,0.4,0.33,0.2,0.2,0.2,0.07 } 
double x = 0.7; 

int position = BinaryFindPosition(v.begin(),v.end(),x); 
// position is 2 
+3

シンプル - 'のstd :: lower_bound'または' STDを使用します。 :upper_bound'。 – PaulMcKenzie

+0

OP - @ PaulMcKenzieがあなたを参照した2つの機能を調べます。あなたは一意でない値を言ったので、 'upper_bound'を使いたいかもしれません。また、値は*逆順でソートされています(最大値が最初に表示されます)。コンパレータを使用するオーバーロードを使用する必要があります。 –

+0

@HappyGreenKidNapsカスタムコンパレータの代わりに 'rbegin()'/'rend()'を使うことができます。 – dasblinkenlight

答えて

2

std::lower_boundを使用してください。あなたのベクトルが大ツー小さな注文されているので、あなたがrbegin()rend()代わりのbegin()end()を使用する必要があることに注意してください:

std::vector<double> v { 0.9, 0.78, 0.6, 0.4, 0.33, 0.2, 0.2, 0.2, 0.07 }; 
double x = 0.7; 
auto pos = std::distance(std::lower_bound(v.rbegin(), v.rend(), x), v.rend()); 
cout << pos << endl; 

Demo.

関連する問題