2012-03-13 18 views
6

Si tengo un std::vector<int>, puedo obtener el índice del elemento mínimo restando dos iteradores:Índice de elemento mínimo en un std :: lista

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

Sin embargo, con los envases que no tienen al azar iteradores de acceso, por ejemplo, std::list<int>, esto no funciona. Claro, es posible hacer algo como

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

pero luego tengo que repetir dos veces en la lista.

¿Puedo obtener el índice del elemento con el valor mínimo con algoritmos STL solo iterando una vez a través de la lista o tengo que codificar mi propio for-loop?

+15

¿Por qué necesita el índice de un elemento en un 'std :: list'? –

+0

Puede escribir un iterador que envuelve 'list :: iterator' y realiza un seguimiento de su índice a medida que avanza. Tendría un uso limitado, ya que insertar/eliminar elementos del contenedor invalidaría los índices almacenados en sus iteradores, pero podría usar 'min_element' y otros algoritmos en él, y luego sacar el índice del valor de retorno. –

+2

Puede usar 'std :: set' u ordenar su contenedor y saber siempre dónde está el elemento mínimo ... – AJG85

Respuesta

1

Vas a tener que escribir su propia función, por ejemplo:

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