2017-06-19 54 views
0

我有一個波長矢量,最小和最大波長值。 使用這些最大值和最小值我需要找到在這個範圍內的波長矢量中的有效索引,並將這些值放在WavelengthArray中。查找向量中特定的第一個和最後一個索引<float> C++

例如:

我有波長的矢量從(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

您的帖子似乎缺少你所遇到的問題的詳細說明和缺少[MCVE。 –

+0

添加了一些信息 – PSDebugger

+0

以及您提供的代碼究竟出了什麼問題? –

回答

0

問題是找到最小索引後,循環就會中斷。

解決您的代碼的簡單方法是 - 找到最小索引後匹配最大索引而不是中斷。

您的代碼將變成這樣的事情:

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

這不是一個好的或最佳的解決方案。這不應該做蠻力,任何人都會因爲這樣做而被踢出面試。 –

+0

我用一句'直白'來描述解決方案。假設問題的作者意識到所提供的代碼的複雜性 - 這種方法對於特定的用例可能也適用。我的答案的重點是在* given *代碼中顯示錯誤。 –

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

+0

給我錯誤,因爲我有'std :: vector p_sWavelangth'中的數據,而最小值最大值爲double。 'static void set_wavelengths2(double wmin,double wmax,std :: vector p_sWavelangth)' – PSDebugger

+0

以鏈接爲例,編譯它,運行它,理解它。你所描述的錯誤與正確調用'lower_bound'無關。你使用的是C++ 11兼容編譯器嗎? – PaulMcKenzie

+0

在剪切和粘貼到作業之前,可能需要做一些工作,Google搜索和理解:) –

相關問題