2012-05-19 10 views
7

Mi piacerebbe trovare l'indice del valore minimo in un C++ std::vector<double>. Ecco un'implementazione un po 'prolissa di questo:ArgMin per il vettore <double> in 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; 
} 

(. Fammi sapere se notate eventuali errori di cui sopra implementazione ho provato, ma il mio test non è affatto esaustivo.)

Penso che la sopra l'implementazione è probabilmente una reinvenzione delle ruote; Mi piacerebbe usare il codice integrato, se possibile. C'è una chiamata a una linea a una funzione STL per questo? Oppure qualcuno può suggerire un'implementazione più concisa?

+3

'std :: min_element' non" restituisce tutti i minuti ". Restituisce un iteratore all'elemento più piccolo dell'intervallo. Se il minimo si verifica più volte, l'iteratore punta al primo. Il tuo 'mins [0]' dovrebbe probabilmente essere '* mins' dato che è un iteratore, non una serie di risultati. – Blastfurnace

risposta

15

È possibile utilizzare il min_element funzione standard:

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

Esso restituisce un iteratore per l'elemento minimo nella gamma iteratore. Poiché si desidera un indice e si sta lavorando con vector s, è possibile quindi sottrarre l'iteratore risultante da vec.begin() per ottenere tale indice.

C'è un sovraccarico aggiuntivo per una funzione o un oggetto funzione se è necessario un confronto personalizzato.

+1

... quindi sottrarre gli iteratori per scoprire l'indice. –

+3

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

+15

@larsmans: Quanto grezzo. Le persone sofisticate dicono 'std :: distance (v.begin(), std :: min_element (v.begin(), v.end()))' :-) –

Problemi correlati