在结构向量中找到最接近的值

时间:2018-09-06 09:39:02

标签: c++

我正在寻找如何在struct向量中找到最相似值的解决方案:

struct tStruct{
    int nr;
    double data1;
    double data2;};

vector<tStruct> tPoint {
    {3, 32.3247351, 14.6209107},
    {4, 32.3262635, 14.6352101},
    {5, 32.3249088, 14.6497090},
    {6, 32.3240278, 14.6642700},
    {7, 32.3256065, 14.6786958}};

我有两个变量double vdata1 = 32.32443, double vdata2 = 14.65692 我想与tPoint向量进行比较,并返回最接近的发现值,例如{5,32.3249088,14.6497090}进行其他一些计算。

有什么办法可以做到这一点?

2 个答案:

答案 0 :(得分:3)

当然有一种方法,通常您会这样做:

tStruct result = tPoint.front(); //Assuming there is always at least one point
auto d = distance(result); // distance() is what you define it to be
for(const auto& point : tPoint)
{
    auto current_distance = distance(point);
    if(current_distance < d)
    {
         d = current_distance; 
         result = point;
    }
}

这几乎是std::min_element的工作,但是我不确定它是否可以缓存距离,因此效果会稍差一些。可能可以将std::min_elementboost::transform_iterator组合使用。

答案 1 :(得分:2)

我建议使用std::min_element标头附带的<algorithm>并传递一个自定义谓词。这样,“最接近的”含义的实际概念可以保留在功能对象中。示例性的代码段可能如下所示:

#include <algorithm>
#include <cmath>

double vdata1 = 32.32443;
double vdata2 = 14.65692;

const auto dist = [vdata1, vdata2](const auto& p){
    // Change the following to your needs
    return std::pow((p.data1 - vdata1), 2) + std::pow((p.data2 - vdata2), 2);
};

const auto closest = std::min_element(tPoint.cbegin(), tPoint.cend(),
        [&dist](const auto& p1, const auto& p2){ return dist(p1) < dist(p2); });