在向量C++中查找特定的第一个和最后一个索引<float>

Find the particular first and last index in vector<float> C++

本文关键字:索引 最后一个 gt lt float 第一个 C++ 向量 查找      更新时间:2023-10-16

我有一个波长矢量,最小和最长值。使用这些最大值和最小值,我需要在此范围内的波长矢量中找到有效索引,并将这些值放入 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;
    }
}

如何做到这一点?

由于数据已排序,因此您无需像现在这样对项目进行线性搜索。 使用 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;
}

现场示例

使用矢量的实时示例

问题是在找到最小索引后,循环会立即中断。

修复代码的简单方法是 - 在找到最小索引而不是中断后匹配最大索引。

您的代码将转换为如下所示的内容:

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;
    }
}