vector — C ++: вставить кортеж в мультимножество с помощью std :: function и сохранить порядок

Проще говоря, что не так с этим фрагментом кода?

    typedef std::function<double()>                             Event;
typedef std::tuple <double, std::function<double()>>        Event_handle;

std::multiset < Event_handle > event_multiset;
std::vector < Event_handle > event_vector;
void add_event_handler(double time, Event func_object)
{
// multiset version gives an error
// event_multiset.insert (std::make_tuple(time, func_object));
// vector is ok
event_vector.push_back(std::make_tuple(time, func_object));
}

составлено с использованием g++ 4.7.2 — с командой просто g++ -std=c++11 main.cpp

Почему я хочу это сделать?

Программа запускается в режиме реального времени и add_even_handler функция включает в себя значение типа double называется time (Обратите внимание, что time переменная здесь не имеет ничего общего с часами или фактическим временем, это просто растущий объект типа double). Поэтому, когда пользователь добавляет какое-либо событие, оно будет вызвано в определенное время.

Многосетевой контейнер в соответствии со стандартом будет сопоставлять объекты в некотором порядке (обычно, если не всегда, std::less<T>). Затем перебирая контейнер, я могу вызвать Event при увеличении изменений переменной double time,

В чем проблема?

Как указал KyleC (см. Его ответ), std::function<> компилятором не понятно в каком процессе заказывать

Как я преодолел проблему

Ты узнаешь что-то новое каждый день. Приведенный выше код был результатом переосмысления проблемы путем первоначального смешивания std::multiset а также std::tuple, std::map<T,S> или же std::multimap<T,S> также сортируется по key который в этом случае имеет тип doubleкоторый по умолчанию по умолчанию снова std::less<T>, Таким образом, вместо вышеупомянутого, я сделал что-то похожее на следующее

std::multimap <double, event> event_map;
void add_event_handler(double time, Event func_object)
{
// multimap is ok
event_map.insert(std::make_pair(time,func_object));
}

Это просто написано здесь на случай, если это может помочь людям, хотя и очевидно, но тем не менее.

1

Решение

Проблема в том, что мультисеть упорядочена.

Ошибка, которую вы получаете:

Error   1   error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const std::function<_Fty>' (or there is no acceptable conversion)
error C2088: '<' : illegal for class    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\tuple    52

Мультимножество не знает, как с этим справиться, потому что не знает, как заказать мультимножество.

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

Что не так с использованием вектора?

— Основываясь на ваших комментариях, я думаю, что карта будет соответствовать вашим целям.

std::map < float, Event > event_map;
event_map.insert(std::make_pair(time, func_object));
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]