2012-05-19 17 views
7

Me gustaría encontrar el índice del valor mínimo en un C++ std::vector<double>. He aquí una aplicación un tanto detallado de esta:ArgMin para el vector <double> en C++?

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

(. Avísame si nota cualquier error en la ejecución por encima de lo probé, pero mis pruebas no es en absoluto exhaustiva.)

Creo que la la implementación anterior es probablemente una reinvención de la rueda; Me gustaría utilizar el código incorporado si es posible. ¿Hay una llamada de una línea a una función de STL para esto? O, ¿alguien puede sugerir una implementación más concisa?

+3

'std :: min_element' no" devuelve todos los minutos ". Devuelve un iterador al elemento más pequeño en el rango. Si el mínimo ocurre varias veces, el iterador apunta al primero. Su 'mins [0]' debería ser '* mins' ya que es un iterador, no una matriz de resultados. – Blastfurnace

Respuesta

15

Se podría utilizar el estándar min_element función:

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

Devuelve un iterador para el elemento mínimo en el rango iterador. Como quiere un índice y está trabajando con vector s, puede restar el iterador resultante de vec.begin() para obtener dicho índice.

Hay una sobrecarga adicional para una función o función-objeto si necesita una comparación personalizada.

+1

... luego reste los iteradores para encontrar el índice. –

+3

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

+15

@larsmans: Qué crudo. Las personas sofisticadas dicen 'std :: distance (v.begin(), std :: min_element (v.begin(), v.end()))' :-) –

Cuestiones relacionadas