gpt4 book ai didi

C++:使用 std::function 在多重集中插入​​元组,并保持顺序

转载 作者:行者123 更新时间:2023-11-30 02:56:16 25 4
gpt4 key购买 nike

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

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

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

最佳答案

问题是多重集是有序的。

您得到的错误是:

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 不知道如何处理这个,因为它不知道如何排序 multiset。

Internally, multiset containers keep all their elements sorted following the criterion specified by its comparison object. The elements are always inserted in its respective position following this ordering.

使用 vector 有什么问题?

-- 根据您的评论,我认为 map 很适合您的目的。

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

关于C++:使用 std::function 在多重集中插入​​元组,并保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15772761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com