Стандартная библиотека C++ (2015)

Имеет значение только хронологический порядок.

Оба приведенных варианта зайдут.

update: подтверждение:

--- Output: size 114 ---
0
3
10:15 0 1 61
10:15 4 1 61
10:16 4 2 east
2 3 
-1
NOTHING
3
10:54 0 4 walker
10:54 4 4 walker
10:55 5 3 driver

--- Correct: size 128 ---
0
3
10:15 0 1 61
10:15 4 1 61
10:16 4 2 east
2 3 
-1
NOTHING
3
10:54 4 4 walker
10:54 0 4 walker
10:55 5 3 driver
# simple test

--- Stderr: size 0 ---

--- Checker output: size 3 ---
OK

update2: Тесты обновлены.

Мы же вроде в пятницу решили, что скорость строго больше нуля …

Так и тот пост старый и уже не актуален ) Тест с нулевыми скоростями давно уже изъят.

А мне форум показал, что новый. хм …

Вот такой вопрос: Компилятор ругается на передачу по ссылке в конструкторе.

Хотя в свое время в первой задаче все прекрасно хавало:

Если передача по ссылке в конструктор - неправильно, то почему сработало тогда, а если правильно, то по какой причине может ругаться сейчас?

Внимательно сообщение об ошибке читаем. Там сказано “не могу преобразовать”.

Хотя я на ваших скриншотах мог и запутаться. Текст ошибки и строку с описанием ошибки киньте (без скринов).

Не знаю, что там со вторым аргументом, но третий аргумент - точно выдаст ошибку: Если указана передача по неконстантной ссылке, то передавать надо все-таки lvalue значение (например, переменную)

Пример (Compilation Error):

Чтоб взлетело, надо добавить модификатор const:

Подозреваю, что со вторым агументом то же самое: метод get_Road() возвращает не lvalue значение.

строка с ошибкой:

Event_4* worker = new Event_4(object.time_str, it_v->second[i_v]->get_Road().number, 4);

object - структура, где хранятся поля сообщений, приходящих в систему «Дороги». object.time_str - это время сообщения в виде string (12:44 например) it_v->second[i_v]->get_Road().number - это указатель, найденную в мапе дорог; по нему мы обратились к соответсвующей дороге из вектора дорог, расположенных на некоторой координате, и извлекли порядковый номер этой дороги.

тект ошибки:

error C2664: “Event_4::Event_4(Event_4 &&)”: невозможно преобразовать аргумент 2 из “int” в “int &”

ошибка пропадает, если в конструкторе класса наследника Event_4 (нарушение 4 типа) в передаваемых параметрах убрать передачу по ссылке (например, вместо int & road_id - писать - int road_id ).

вопрос состоит в том, что: у меня, как и в первой задаче, есть конструктор в родительском Event. В каждом классе наследнике Event_i есть конструктор, определенный на основе исходного

при передаче параметров в конструктор я использую передачу по ссылке, как и раньше. Вот только в прошлый раз все прекрасно работало, а в этот раз компилятор ругается, что почему-то он пытается преобразовывать преобразовать адрес переменной к ее типу.

get_Road возвращает структуру, в которой находятся поля, описывающие дорогу. get_Road().number соотвественно возвращает порядковый номер дороги. по поводу третьего аргумента, да, исправил. но ошибка идет из-за второго.

const надо поставить и перед вторым аргументом. Во всех конструкторах.

get_Road здесь возвращает rvalue-значение (“которое можно только сохранить”), поэтому проблемы. А аргумент, обозначенный как int&, ждет lvalue (“в которое можно сохранять”).

Подробнее тут: https://msdn.microsoft.com/ru-ru/library/f90831hc.aspx

Видимо, в прошлый раз было что-то вроде такого:

сlassT::сlassT(int &);
...
data = 1+1;
classT* obj = new classT(data); 

Тут все ok, ибо в конструктор передано lvalue-значение.

Спасибо, все исправил.

Да, Дима все верно разъяснил.

Совершенно неверно! Вы подаете объект типа int, а компилятор просит ссылку на int. Нет тут адреса, и никто его к типу не преобразует. В С++ cимвол & - это не только взятие адреса, но и ссылка. Будьте внимательны в этом вопросе.

В чем могут быть причины несоответствия ответов у меня на компьютере и на ejudge? Просто проверяю по инпутам у меня на компьютере выдает такой же оутпут, на ejudge другой…

Обычно такое бывает из-за связки: undefined behaviour + разные компиляторы.

а как отловить такую радость? :slight_smile: у меня в студии все по реквестам 1,2 идеально работает, а вот ejudge мусором плюётся каким то. то объекты перемешаны не пойми как, то их количество не совпадает с необходимым. Бросать студию и писать в Eclipse с gcc?)

Можно попробовать логгировать значения ключевых переменных: ejudge вывод в stderr отображает. Сравнить локальный вывод и на ejudge -> по ним определить проблемные участки кода.

Порядок вывода событий, произошедших в одну минуту, не важен. По несовпадающему кол-ву можно определить, каких нехватает и где искать причину.

чаще всего out of range

Роман Борисович, не понятно в чем проблема. При считывании данных (времени объекта и преобразовании в int с помощью аtoi) выбрасывается исключение “terminating with uncaught exception of type std::out_of_range: basic_string”. C функцией stoi выбрасывалось invalid_argument. Дома на Visual Studio программа выполняется и выдает верный ответ. На Ideone C++ 5.1 (комп. g++ 5.1) тоже все компилируется. Вот на всякий случай тект считывания: http://pastebin.com/mtzNby91


Время считывается верно:


Ответ выдается тоже вроде верный:

Подозреваю, что дело в пустой строке, которую ejudge добавляет в конец ин-файла.

И еще. Вот это:

 void (*answer_request[4])(ifstream & fin, ofstream & fout, map<int, vector<Road*>> & ver_roads, map<int, vector<Road*>> & hor_roads, vector<Event*> & events, vector<vector<roads_speeds>> & speeds, int & time_num) =
        { f0, f1, f2, f3 }; 

я ни понять, ни простить не смогу :slight_smile:

ну так пришлось писать потому, что ваш вариант:

void f1(...){...}
void f2(...){...}
  ...
void* answer = {&f1, &f2, &f3, &f4};
  ...
answer[i](...);

компилятор не считает правильным.