Вопреки тому, что говорят другие, я не верю, что замена двух вызовов на std::max_element()
и std::min_element()
на один minmax_element()
значительно повысит производительность, поскольку повторение 2 * n раз за 1 операцию илиповторение n раз с двумя операциями мало что меняет.
Что, однако, будет иметь значение, так это полное исключение двух вызовов из вашего алгоритма.То есть найдите минимальный и максимальный элементы, а затем проверьте их при появлении новых данных, а не сравнивайте новые данные со всем контейнером снова.
double obterNormLarguraBanda(const std::vector<double>& v,
double maximo, double minimo)
{
return (v.back()-minimo)/(maximo - minimo);
}
bool excludeWrong(double i, double j)
{
if (i==-1 || j==-1) return false;
return i<j;
}
// usage example
void f()
{
std::vector<double> v;
// ...
double maximo = *max_element(inicio, v.end(), excludeWrong);
double minimo = *min_element(inicio, v.end(), excludeWrong);
for( int i = 0; i != 1000; ++i ) {
// if( ! excludeWrong(new_datum, maximo) ) maximo = new_datum;
// if( excludeWrong(new_datum, minimo) ) minimo = new_datum;
double d = obterNormLarguraBanda(...);
}
}