Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странное поведение итераторов, или я туплю 
V
    Опции темы
alexSl
Дата 16.3.2012, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


проходил мимо



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



Есть нормирующая функция :
Код

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 перестает нормировать после максимального значения.
Собственно вопрос: кто ошибся, я или компилятор ?

тестовый код




PM MAIL   Вверх
mabrarov
Дата 16.3.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



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

max_abs - итератор, и Вы модифицируете то, на что он указывает, во 2-ом std::transform. В итоге какая-то часть vec (зависит, от того, куда именно указывает max_abs) начинает делиться на 1 (или что-то близкое - все-таки это double).
PM MAIL WWW Skype   Вверх
alexSl
Дата 16.3.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


проходил мимо



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 22.2.2008

Репутация: нет
Всего: нет



Да, затупил я. Но надежда была...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.