【问题标题】:C++: insert tuple in multiset with std::function, and keeping an orderC ++:使用std :: function在multiset中插入元组,并保持顺序
【发布时间】:2013-03-24 06:11:29
【问题描述】:

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

    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&lt;T&gt;)。然后循环容器,我可以在变量double time的变化增加时调用Event

有什么问题?

正如 KyleC 所指出的(见他的回答),std::function&lt;&gt; 编译器不理解在​​什么过程中订购

我是如何克服这个问题的

你每天都能学到新东西。上面的代码是最初混合std::multisetstd::tuple 过度思考问题的结果。 std::map&lt;T,S&gt;std::multimap&lt;T,S&gt; 也按关联的 key 排序,在本例中为 double 类型,默认情况下又是 std::less&lt;T&gt;。所以代替上面的,我做了类似下面的事情

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));
}

这只是写在这里,以防它可能对人们有所帮助,尽管很明显但仍然如此。

【问题讨论】:

  • 你能发布错误的相关部分吗?
  • @KyleC 快速问题,如何在 g++ 中将编译器错误输出到文本文件?

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


【解决方案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

多重集不知道如何处理这个问题,因为它不知道如何对多重集进行排序。

在内部,多重集容器保持其所有元素排序 遵循其比较对象指定的标准。这 元素总是插入到其各自的位置之后 订购。

使用矢量有什么问题?

-- 根据您的 cmets,我认为地图非常适合您的目的。

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

【讨论】:

  • 好点应该知道。在以下情况下,您有什么建议。该程序实时运行,add_even_handler 函数包含一个名为timedouble 类型的值。因此,当用户添加一些事件时,它将在某个时间被调用。 (注意时间与时钟无关,它只是一个增加的变量)。在一个多重集中,我假设tuple 的第一个元素会自动排序(这显然是错误的,就像你说的那样)。
  • 你应该只使用一个对你有用的 std::map ,因为浮点数将是排序的“键”。
  • 谢谢,现在更有意义了
猜你喜欢
  • 2012-10-23
  • 2011-02-08
  • 2010-10-06
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2021-08-19
  • 2010-12-09
相关资源
最近更新 更多