Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Странное поведение итераторов, или я туплю


Автор: alexSl 16.3.2012, 14:22
Есть нормирующая функция :
Код

std::vector<double> & norm_vec(std::vector<double> &vec)
{
    auto max_abs = std::max_element(vec.begin(),vec.end(),
                    [](double & d1,double & d2)
                    {return ::fabs(d1) < ::fabs(d2)  ;});

    double scale = ::fabs((*max_abs));//Непонятно зачем, но без этого не работает.

    std::transform(vec.begin(),vec.end(),vec.begin(),
                    [&](double & v){return v/scale;});

    return vec;
}

std::vector<double> & norm2_vec(std::vector<double> &vec)
{
    auto max_abs = std::max_element(vec.begin(),vec.end(),
                    [](double & d1,double & d2)
                    {return ::fabs(d1) < ::fabs(d2)  ;});

    //double scale = ::fabs((*max_abs));//Непонятно зачем, но без этого не работает.

    std::transform(vec.begin(),vec.end(),vec.begin(),
                    [&](double & v){return v/::fabs((*max_abs));});

    return vec;
}


По каким-то, неизвесным мне, причинам вариант 1 рабочий, а вариант 2 перестает нормировать после максимального значения.
Собственно вопрос: кто ошибся, я или компилятор ?

http://liveworkspace.org/code/4a1f72815ef7338c9bc3d8a144f08846




Автор: mabrarov 16.3.2012, 16:06
Цитата(alexSl @ 16.3.2012,  14:22)
По каким-то, неизвесным мне, причинам вариант 1 рабочий, а вариант 2 перестает нормировать после максимального значения.
Собственно вопрос: кто ошибся, я или компилятор ?

max_abs - итератор, и Вы модифицируете то, на что он указывает, во 2-ом std::transform. В итоге какая-то часть vec (зависит, от того, куда именно указывает max_abs) начинает делиться на 1 (или что-то близкое - все-таки это double).

Автор: alexSl 16.3.2012, 16:20
Да, затупил я. Но надежда была...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)