2016-12-29 3 views
-1

C++には、ソートされたベクトルでキーに最も近い値を見つけることができ、そのインデックス(イテレータ)を返すテンプレートがあります。私が見つけたものは、ブール値だけを返します。キーに最も近いdoubleを見つけるためのバイナリ検索テンプレート

編集:質問は、バイナリ検索がブール値を返すという事実によって動機づけられました。私はブール値を返す時にイテレータも知られていると結論づけます。それを返すと、要素が見つかりました。そのようなバイナリ検索が提供されない理由は何ですか?

+3

http://www.cplusplus.com/reference/algorithm/lower_bound/ –

+1

を見てみましょうあなたは1を書き込むことができます。あまりにも難しいことではありません。 – Shravan40

+0

コンテナ/配列をソートしたくない場合、良いコンパレータを使って 'std :: min_element'を実行してください。 –

答えて

0

あなたがあなたのコンテナ/アレイの並べ替えを避けたいのかどうかわからないので、私は最も普遍的な方法で投稿します。答えは - いいえ。あなたは、コンテナをソートしたくない場合は、何の準備テンプレートはありませんが、あなたは、単にこのように、自分自身の関数を書くことができます。

template<typename iterator_t, typename value_t, typename comparator_t> 
iterator_t nearest_element(iterator_t begin, iterator_t end, value_t value, comparator_t comparator) { 
    return std::min_element(begin, end, [value, &comparator](double lhs, double rhs) { 
     return comparator(std::abs(lhs - value), std::abs(rhs - value)); 
    }); 
} 

template<typename iterator_t, typename value_t> 
iterator_t nearest_element(iterator_t begin, iterator_t end, value_t value) { 
    return nearest_element(begin, end, value, std::less<value_t>()); 
} 

それは単純な数学ですが、最寄りの要素は、それを差し引くの最小絶対値を有するものです検索された値から。上記のコードでは、コンパレータを変更することができます(但し、減算/ std::fabsを隠す)ので、最も遠い値を見つけるためにも使用できます。 (指定されたコンパレータなし)

使用法は、他の標準関数と同様、簡単です:

std::vector<double> vec {2., 5., -4.}; 
auto it = nearest_element(vec.begin(), vec.end(), -10.); 
std::cout << *it << std::endl; 
関連する問題