C ++:使用std :: function在multiset中插入元组,并保持顺序

时间:2013-04-02 19:33:05

标签: c++ vector insert std-function multiset

很简单,这段代码出了什么问题?

    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的{​​{1}}类型值(注意time变量此处与时钟无关或实际时间,它只是double类型的增加对象。因此,当用户添加某个事件时,它将在某个时间被调用。

标准下的多集合容器会按某种顺序整理对象(通常,如果不是总是time)。然后循环遍历容器,我可以在增加变量std::less<T>的变化时调用Event

有什么问题?

正如KyleC指出的那样(参见他的回答),编译器无法理解double time订购的过程

我如何克服这个问题

你每天都学到新东西。上面的代码是通过最初混合std::function<>std::multiset来解决问题的结果。 std::tuplestd::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 个答案:

答案 0 :(得分:3)

问题是订购了multiset。

您收到的错误是:

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

multiset不知道如何处理这个问题,因为它不知道如何订购多重集。

  

在内部,多集合容器会对其所有元素进行排序   遵循其比较对象指定的标准。该   在此之后,元素始终插入其各自的位置   排序

使用矢量有什么问题?

- 根据您的评论,我认为地图可以很好地满足您的目的。

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