2012-05-19 62 views
7

我想在C++ std::vector<double>中找到最小值的索引。這裏是一個有點繁瑣實現這一點:ArgMin for vector <double> in C++?

//find index of smallest value in the vector 
int argMin(std::vector<double> vec) 
{ 
    std::vector<double>::iterator mins = std::min_element(vec.begin(), vec.end()); //returns all mins 
    double min = mins[0]; //select the zeroth min if multiple mins exist 
    for(int i=0; i < vec.size(); i++) 
    { 
     //Note: could use fabs((min - vec[i]) < 0.01) if worried about floating-point precision 
     if(vec[i] == min)  
      return i; 
    } 
    return -1; 
} 

(讓我知道你是否注意到在上述實施任何錯誤我測試了,但我的測試是不是在所有詳盡。)

我覺得以上的實施可能是一個車輪改造;如果可能,我想使用內置代碼。是否有爲此而對STL函數進行單行調用?或者,有人可以建議一個更簡潔的實施?

+3

'std :: min_element'不會「返回所有分鐘」。它將一個迭代器返回到範圍中的最小元素。如果最小值出現多次,則迭代器指向第一個。你的'mins [0]'應該是'* mins',因爲它是一個迭代器,而不是一個結果數組。 – Blastfurnace

回答

15

你可以使用標準的min_element功能:

std::min_element(vec.begin(), vec.end()); 

它返回一個迭代的迭代器區間的最小元素。既然你想要一個索引,並且你正在使用vector s,那麼你可以從vec.begin()減去得到的迭代器來獲得這樣的索引。

如果您需要自定義比較,則函數或函數對象有一個額外的重載。

+1

...然後減去迭代器找出索引。 –

+3

'std :: min_element(v.begin(),v.end()) - v.begin()' –

+15

@larsmans:多麼粗俗。複雜的人說'std :: distance(v.begin(),std :: min_element(v.begin(),v.end()))':-) –

相關問題