ArgMin для вектора в C++?

Я хотел бы найти индекс минимального значения в 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 ответов


вы можете использовать стандартный min_element функция:

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

он возвращает итератор к минимальному элементу в диапазоне итераторов. Поскольку вам нужен индекс, и вы работаете с vectors, затем вы можете вычесть полученный итератор из vec.begin() чтобы получить такой индекс.

существует дополнительная перегрузка для функции или function-object, если вам нужно пользовательское сравнение.