2012-03-13 20 views
6

अगर मैं एक std::vector<int> है, मैं कम से कम तत्व के सूचकांक दो iterators को घटा कर प्राप्त कर सकते हैं:सूचकांक :: सूची

int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin(); 

हालांकि, कंटेनर कि यादृच्छिक की जरूरत नहीं है के साथ इटरेटर का उपयोग करें, उदाहरण के लिए std::list<int>, यह काम नहीं करता है। निश्चित रूप से,

int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end())); 

जैसे कुछ करना संभव है लेकिन फिर मुझे सूची के माध्यम से दो बार फिर से शुरू करना होगा।

क्या मुझे सूची के माध्यम से केवल एक बार फिर से चलकर एसटीएल एल्गोरिदम के साथ न्यूनतम मान के साथ तत्व की अनुक्रमणिका मिल सकती है या क्या मुझे अपना खुद का लूप कोड करना है?

+15

क्यों आप एक 'std :: list' में एक तत्व के सूचकांक क्या ज़रूरत है? –

+0

आप एक इटरेटर लिख सकते हैं जो 'list :: iterator' को लपेटता है और इसके सूचकांक का ट्रैक रखता है। इसमें सीमित उपयोग होगा, क्योंकि कंटेनर से तत्वों को सम्मिलित/निकालने से आपके इटरेटर में संग्रहीत इंडेक्स को अमान्य कर दिया जाएगा, लेकिन आप उस पर 'min_element' और अन्य एल्गोरिदम का उपयोग कर सकते हैं, फिर वापसी मूल्य से सूचकांक को पकड़ें। –

+2

आप 'std :: set' का उपयोग कर सकते हैं या अपने कंटेनर को सॉर्ट कर सकते हैं और हमेशा जानते हैं कि न्यूनतम तत्व कहां है ... – AJG85

उत्तर

1

आप अपने खुद के समारोह लिखने के लिए उदाहरण के लिए होगा:

template <class ForwardIterator> 
    std::size_t min_element_index (ForwardIterator first, ForwardIterator last) 
{ 
    ForwardIterator lowest = first; 
    std::size_t index = 0; 
    std::size_t i = 0; 
    if (first==last) return index; 
    while (++first!=last) { 
    ++i; 
    if (*first<*lowest) { 
     lowest=first; 
     index = i; 
    } 
    } 
    return index; 
} 
संबंधित मुद्दे