我正在寻找如何在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}进行其他一些计算。
有什么办法可以做到这一点?
答案 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_element
和boost::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); });