2012-03-13 17 views
6

如果我有一個std::vector<int>,我可以通過減去兩個迭代獲得最小元素的索引:指數::列表

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())); 

但我必須迭代兩次通過列表。

我可以用STL算法得到具有最小值的元素的索引,只需迭代一次列表,或者我必須編寫自己的for-loop?

+15

爲什麼你需要的元素在'的std :: list'指數? – 2012-03-13 16:25:41

+0

你可以編寫一個迭代器來包裝'list :: iterator',並在它的索引中跟蹤它的索引。由於從容器中插入/刪除元素會使存儲在迭代器中的索引失效,但您可以使用'min_element'和其他算法,然後從返回值中獲取索引。 – 2012-03-13 16:28:28

+2

你可以使用'std :: set'或者排序你的容器,並且始終知道最小元素在哪裏...... – AJG85 2012-03-13 16:30:42

回答

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