C++には、ソートされたベクトルでキーに最も近い値を見つけることができ、そのインデックス(イテレータ)を返すテンプレートがあります。私が見つけたものは、ブール値だけを返します。キーに最も近いdoubleを見つけるためのバイナリ検索テンプレート
編集:質問は、バイナリ検索がブール値を返すという事実によって動機づけられました。私はブール値を返す時にイテレータも知られていると結論づけます。それを返すと、の要素が見つかりました。そのようなバイナリ検索が提供されない理由は何ですか?
C++には、ソートされたベクトルでキーに最も近い値を見つけることができ、そのインデックス(イテレータ)を返すテンプレートがあります。私が見つけたものは、ブール値だけを返します。キーに最も近いdoubleを見つけるためのバイナリ検索テンプレート
編集:質問は、バイナリ検索がブール値を返すという事実によって動機づけられました。私はブール値を返す時にイテレータも知られていると結論づけます。それを返すと、の要素が見つかりました。そのようなバイナリ検索が提供されない理由は何ですか?
あなたがあなたのコンテナ/アレイの並べ替えを避けたいのかどうかわからないので、私は最も普遍的な方法で投稿します。答えは - いいえ。あなたは、コンテナをソートしたくない場合は、何の準備テンプレートはありませんが、あなたは、単にこのように、自分自身の関数を書くことができます。
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;
http://www.cplusplus.com/reference/algorithm/lower_bound/ –
を見てみましょうあなたは1を書き込むことができます。あまりにも難しいことではありません。 – Shravan40
コンテナ/配列をソートしたくない場合、良いコンパレータを使って 'std :: min_element'を実行してください。 –