LINUX.ORG.RU

Ошибка с функцией sort в C++

 , ,


0

2

Доброго времени суток.
Изучаю C++ по книге «Stroustrup Bjarne - Programming- Principles and Practice using C++, 2nd». Дошёл до векторов, в книге приводится пример с температурами
http://i.piccy.info/i9/105309d932f37898357ae68de01a693e/1438001476/146931/895...

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
  vector <double> temps;
  for(double temp; cin >> temp;)
    temps.push_back(temp);
  double sum = 0;
  for(int x : temps)
    sum += x;
  cout << "Average temperature: " << sum / temps.size() << '\n';
  sort(temps);
  cout << "Median temperature: " << temps[temps.size() / 2] << '\n';
return 0;
}

Пробую скомпилировать, выпадает ошибка:
https://bpaste.net/show/18e70b20bd20
Если убрать '-std=c++11' то тогда ругается на 'range-based «for» loops are not allowed in C++98 mode'
В чём проблема?

ps Дальше идут упражнения, основывающиеся на данном примере. А я не могу понять, почему не работает пример, то ли я где-то допустил ошибку, то ли проблема с компилятором.
Использую gcc-4.8.4, Gentoo Linux.

А код из книги есть где-то в открытом доступе? Или ты ошибся, и там передают итераторы, или Страуструп написал оберточку и у тебя не хватает одного include с его хидером.

anonymous
()

Я надеюсь, там дальше будет написано в книге, что если вектор пустой, то будет бо-бо с сегфолтом?

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Похоже разобрался. Ошибки в коде нет, надо было добавить в #include вот этот файл http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Он ранее в книге упоминался (предполагается, что читающий работает под Microsoft Visual Studio C++).
Но всё же интересно, почему отличается от реализации, приведенно staseg.

sspphheerraa
() автор топика
Ответ на: комментарий от mix_mix

что если вектор пустой, то будет бо-бо с сегфолтом?

Быстрее будет бо-бо с делением на ноль, внимательный вы наш.

eao197 ★★★★★
()

Что-то слабо верится, что это из книги код. Деление на size() вектора, который может быть равен нулю. Вводим дробные температуры, а потом округляем их до целого, но это целое присваиваем опять double и считаем среднюю. Бред же.

invy ★★★★★
()

Median temperature:

man median

// на правах «просто так»:

- for(int x : temps)
-     sum += x;
+ std::for_each(temps.cbegin(), temps.cend(), [&sum] (double x) { sum += x; });

Stil ★★★★★
()
Ответ на: комментарий от Stil

Ну и зачем более читаемый вариант заменять на менее читаемый, который делает то же самое?

anonymous
()
Ответ на: комментарий от Stil

Чтоб не открывать новую тему, спрошу здесь же.
Выполняю задания по главе 4 «Cumputation».
http://i.piccy.info/i9/90cbc934bd34e1f87e87c7e329d028ea/1438191288/230790/895...
Первые 6 выполнил. В 7 не понимаю, что надо сделать...
На сделать так, чтобы пользователь вводил цифры с буквами (так «5.4cm»), затем из этого ввода как-то распознать отдельно цифры и отдельно единицы размерности, потом что-то вычислять...
Что именно спрашивается? Как вы понимаете?

sspphheerraa
() автор топика
Ответ на: комментарий от sspphheerraa

Пользователь вводит число с единицей измерения. Допустимо и то, чтобы единица измерения была через пробел, и то, чтобы она была сразу за числом без пробела. Допустимые единицы измерения cm, m, in, ft. Надо напечатать: «the smaller value is: <тут вывести наименьшее> » и «the larger value is: <тут, соответственно, наибольшее>». Короче, модификация всех предыдущих заданий с добавлением единицы измерения.

fluorite ★★★★★
()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от fluorite

Пришел к тому, что если ввести «4.5in» то при коде:

double tmp;
string unit;
cin >> tmp >> unit
, оно автоматом запишет цифры в tmp, а буквы в unit. Для меня было неожиданностью то, что пользователь может не нажимая Enter (между цифрами и буквами) ввести данные, и они автоматом распределятся по переменным, когда в коде они разделены >>,т.е. вводим одно потом другое. Собственно, это и было камнем преткновения. Пошёл дальше. Всем спасибо за помощь.

sspphheerraa
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.