【问题标题】:Find position of a number in array closest to given number查找数组中最接近给定数字的位置
【发布时间】:2021-08-14 22:35:17
【问题描述】:

我正在寻找一种优雅的方法来查找数组中最接近给定值的元素。

这是一个有效的实现:

std::vector<double> array = { /* numbers */ };
double num = /* given number */;
double min_diff = std::abs(array[0] - num);
size_t best_pos = 0;
for (size_t i = 1; i < array.size(); i++) {
    double curr_diff = std::abs(array[i] - num);
    if (curr_diff < min_diff) {
        min_diff = curr_diff;
        best_pos = i;
    }
}
std::cout << best_pos << std::endl;

有没有更好的解决方案(不是算法,而是更漂亮)?也许是&lt;algorithm&gt;

best_pos类型没有限制,可以是std::iterator

【问题讨论】:

  • std::upper_boundstd::lower_bound 如果已排序将是一个好的开始
  • 可能是基于范围的for 循环?
  • @NathanOliver 不幸的是它没有排序
  • std::min 带有自定义谓词。美是很主观的。为什么您认为您当前的解决方案不优雅? “产生正确的结果”很漂亮;)
  • @πάνταῥεῖ 如何在基于范围的数组中获得位置?

标签: c++ algorithm stl


【解决方案1】:

要找到最小化某些功能的元素,您可以使用std::min_element。请注意,这不是最有效的,因为它会评估每次比较要最小化的函数。当要最小化的函数成本更高时,您可能宁愿填充函数结果的容器,然后在其中找到最小值。虽然只要只是调用std::abs 就可以了:

#include <vector>
#include <iostream>
#include <algorithm>

int main(){ 
    std::vector<double> vect = { 1,2,3,6,7,8 };
    double num = 4;
    auto it = std::min_element(vect.begin(),vect.end(),[num](double x,double y){ 
        return std::abs(num-x) < std::abs(num-y); 
    });
    std::cout << *it << std::endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2018-08-13
    • 2011-01-05
    相关资源
    最近更新 更多