2012-05-19 18 views
7

インデックスの最小値は、C++ std::vector<double>です。ここでは、こののやや冗長な実装です:ベクトルのArgMin <double> 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; 
} 

(私はそれをテストし、あなたが上記の実装で間違いに気づいた場合、私に教えてください、私のテストが全く完全ではありません。。)

私は思いますおそらくホイールリニューアルです。可能であれば、組み込みコードを使用したいと思います。このためのSTL関数への1行の呼び出しはありますか?あるいは、誰かがより簡潔な実装を提案することができますか?

+3

'std :: min_element'は「すべての分を返す」ではありません。範囲内の最小の要素にイテレータを返します。最小値が複数回発生する場合、イテレータは最初の点を指します。あなたの 'mins [0]'は結果の配列ではなく、反復子であるため、おそらく '* mins'でなければなりません。 – Blastfurnace

答えて

15

あなたは標準min_element機能を使用できます。

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

それはイテレータの範囲内の最小の要素にイテレータを返します。インデックスが必要なので、vectorで作業しているので、その結果のイテレータをvec.begin()から減算して、そのようなインデックスを得ることができます。

カスタム比較が必要な場合は、関数または関数オブジェクトの追加オーバーロードがあります。

+1

...次に、イテレータを減算してインデックスを見つけます。 –

+3

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

+15

@larsmans:どのような原油。洗練されていない人は、 'std :: distance(v.begin()、std :: min_element(v.begin()、v.end()))') ''と言っています。 –

関連する問題