2012-05-19 8 views
7

मैं C12+ std::vector<double> में न्यूनतम मान के अनुक्रमणिका ढूंढना चाहता हूं। यहाँ इस बात का कुछ हद तक एक वर्बोज़ कार्यान्वयन है:सी ++ में वेक्टर <double> के लिए ArgMin?

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

(। मुझे पता है अगर आप उपरोक्त कार्यान्वयन में कोई गलती नोटिस करते हैं मैं इसे परीक्षण किया है, लेकिन अपनी परीक्षण बिल्कुल संपूर्ण नहीं है।)

मुझे लगता है कि कार्यान्वयन के ऊपर शायद एक व्हील-पुनर्विचार है; यदि संभव हो तो मैं अंतर्निर्मित कोड का उपयोग करना चाहता हूं। क्या इसके लिए एसटीएल फ़ंक्शन में एक-लाइन कॉल है? या, क्या कोई अधिक संक्षिप्त कार्यान्वयन का सुझाव दे सकता है?

+3

'std :: min_element'" सभी मिनटों को वापस नहीं करता "। यह सीमा में सबसे छोटे तत्व के लिए एक पुनरावर्तक देता है। यदि न्यूनतम कई बार होता है तो इटेटरेटर पहले को इंगित करता है। आपके 'मिनट [0]' शायद '* mins' होना चाहिए क्योंकि यह एक पुनरावर्तक है, परिणाम की सरणी नहीं। – Blastfurnace

उत्तर

15

आप मानक min_element समारोह इस्तेमाल कर सकते हैं:

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

यह इटरेटर रेंज में न्यूनतम तत्व को एक iterator देता है। चूंकि आप एक इंडेक्स चाहते हैं और आप vector एस के साथ काम कर रहे हैं, तो आप इस सूचकांक प्राप्त करने के लिए परिणामस्वरूप इटरेटर को vec.begin() से घटा सकते हैं।

यदि आपको कस्टम तुलना की आवश्यकता है तो फ़ंक्शन या फ़ंक्शन-ऑब्जेक्ट के लिए अतिरिक्त अधिभार है।

+1

... फिर इंडेक्स को खोजने के लिए इटरेटर को घटाएं। –

+3

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

+15

@ लार्समैन: कितना कच्चा। परिष्कृत लोग कहते हैं 'std :: दूरी (v.begin(), std :: min_element (v.begin(), v.end())) ':-) –

संबंधित मुद्दे