Indice dell'elemento minimo in uno std :: list
-
13-12-2019 - |
Domanda
Se ho un std::vector<int>
, posso ottenere l'indice dell'elemento minimo sottraendo due iteratori:
int min_index = std::min_element(vec.begin(), vec.end()) - vec.begin();
.
Tuttavia, con contenitori che non hanno iteratori di accesso casuali, ad esempio un std::list<int>
, questo non funziona.Certo, è possibile fare qualcosa come
int min_index = std::difference(l.begin(), std::min_element(l.begin(), l.end()));
.
Ma poi devo iterare due volte attraverso la lista.
Posso ottenere l'indice dell'elemento con il valore minimo con gli algoritmi STL solo in itrating una volta attraverso l'elenco o devo codificare il mio per-loop?
Soluzione
Dovrai scrivere la tua funzione, ad esempio:
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;
}
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow