13

C++ で最小値のインデックスを見つけたいと思いますstd::vector<double>。これはやや冗長な実装です:

//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 行の呼び出しはありますか? または、誰かがより簡潔な実装を提案できますか?

4

1 に答える 1

25

標準min_element関数を使用できます:

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

イテレータ範囲の最小要素にイテレータを返します。インデックスが必要で、vectors を使用しているため、結果のイテレータを減算してそのvec.begin()ようなインデックスを取得できます。

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

于 2012-05-19T18:36:07.650 に答える