【发布时间】:2019-06-01 01:01:20
【问题描述】:
我想要完成的是遍历一个双精度值向量并返回最接近的双精度值的向量位置。我有两个问题。
当尝试使用
lower_bound()查找向量中最接近的双精度值时,如果我输入 1,我只会收到一个非零值。我不知道如何使用
lower_bound来返回向量位置而不是双精度值。
这是我在尝试代码中使用的三个主要文件
转换.cpp
double Convert::convertmVtoK(double value)
{
double conversion = *std::lower_bound(mV.begin(), mV.end(), value);
cout<<"This is conversion mV to K"<<" "<< conversion;
}
double Convert::convertKtomV(double value)
{
double conversion = *std::lower_bound(mV.begin(), mV.end(), value);
cout<<"This is conversion K to mV"<<" "<< conversion;
}
转化率.h
class Convert
{
public:
Convert();
virtual ~Convert();
double convertmVtoK(double mV);
double convertKtomV(double K);
void readFile();
protected:
private:
std::ifstream inFile;
std::vector<double> kelvin,mV,sensitivity;
double tempKelvin,tempmV,tempSensitivity;
};
#endif // CONVERT_H
Main.cpp
#include "Convert.h"
#include <stdio.h>
#include<fstream>
#include<iostream>
int main()
{
Convert convert;
convert.readFile();
convert.convertmVtoK(2.0);
convert.convertKtomV(5.000);
return 0;
}
更新:所以我仍在尝试使用 lower_bound()。这是我更新的函数。
double Convert::convertmVtoK(double value)
{
std::vector<double>::iterator pos;
pos = std::lower_bound(mV.begin(), mV.end(), value);
cout<<"This is conversion mV to K"<<" "<< kelvin[(pos-mV.begin())];
}
目前,如果我输入一个浮点值,我仍然无法接收到正确的向量值,它要么返回 0,要么返回 [0] 向量值。
更新 2:文本值
1.4 1.644290 -12.5
1.5 1.642990 -13.6
1.6 1.641570 -14.8
1.7 1.640030 -16.0
1.8 1.638370 -17.1
1.9 1.636600 -18.3
2.0 1.634720 -19.3
2.1 1.632740 -20.3
【问题讨论】:
-
lower_bound() 不会将迭代器返回到最接近的值。它返回一个迭代器到第一个不超过你的值的元素,即在这种情况下第一个元素
>= 5.000。 -
@SidS 你能推荐使用什么而不是 lower_bound 来找到向量中最接近的值吗?
-
遍历整个向量,跟踪最接近的值。或者,如果您要对相同的数据重复执行此操作,请对向量进行排序,然后进行二分搜索。
-
您需要创建一个minimal reproducible example。空的构造函数和析构函数,从文件读取等与您的问题完全无关。删除所有与您发布的问题无关的内容,并将其全部制作为单个编译文件。
-
@SidS 好的,谢谢您的建议。所以我了解如何对精确值进行二进制搜索,我将如何对最接近的值进行二进制搜索?
标签: c++ vector iterator lower-bound