我有一个波长,最小和最大波长值的矢量。 使用这些最大值和最小值,我需要在波长的矢量中找到该范围内的有效索引,并将这些值放在WavelengthArray中。
例如:
我有一个从(200到900)开始的波长矢量,总波长是2048但是我需要找到最小值(例如300)和最大值(800)之间的波长并将它们放在一个数组中。 但是我需要波长矢量的第一个索引和最后一个索引,因为我需要将数据对应于这些波长。std::vector<double> vDoubles(p_sWavelangth.begin(), p_sWavelangth.end());
int firstIndex,lastIndex;
double WavelengthArray[2048];
for (int index = 0; index < p_sWavelangth.size(); index++) {
if (p_sWavelangth[index] >= wmin) {
firstIndex = index;
break;
}
else if (p_sWavelangth[index] >= wmax) {
lastIndex = index-1;
break;
}
}
如何做到这一点?
答案 0 :(得分:1)
由于数据已排序,因此您无需像现在一样对项目进行线性搜索。使用诸如std::lower_bound之类的算法函数将对数据进行二进制搜索,如果您有许多要搜索的项目,则效率会更高。
#include <algorithm>
#include <string>
#include <iostream>
int main()
{
float test[] = { 1, 2, 3, 199, 300, 301, 690, 799, 1000, 1100};
float *pFirst = std::lower_bound(std::begin(test), std::end(test), 200);
float *pLast = std::prev(std::lower_bound(std::begin(test), std::end(test), 800));
std::cout << *pFirst << " " << *pLast << "\n";
// Now get the index
auto index1 = std::distance(test, pFirst);
auto index2 = std::distance(test, pLast);
std::cout << index1 << " " << index2;
}
答案 1 :(得分:0)
问题是在找到min index之后就会出现循环中断。
修复代码的简单方法是 - 在找到最小索引而不是中断后匹配最大索引。
您的代码将转换为以下内容:
bool min_found = false;
for (int index = 0; index < p_sWavelangth.size(); index++) {
if (!min_found && p_sWavelangth[index] >= wmin) {
firstIndex = index;
min_found = true;
}
else if (min_found && p_sWavelangth[index] >= wmax) {
lastIndex = index-1;
break;
}
}