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

时间:2017-06-19 21:37:01

标签: c++

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

如何做到这一点?

2 个答案:

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

Live Example

Live Example using vector

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