[英]C++: insert tuple in multiset with std::function, and keeping an order
很簡單,這段代碼有什么問題?
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>
)。 然后循環遍歷容器,我可以在增加變量double time
調用Event
。
問題是什么?
正如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));
}
這只是在這里寫的,它可以幫助人們,雖然很明顯,但仍然。
問題是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不知道如何處理這個問題,因為它不知道如何訂購multiset。
在內部,多集合容器使其所有元素按照其比較對象指定的標准進行排序。 在排序之后,元件總是插入其各自的位置。
使用矢量有什么問題?
- 根據您的評論,我認為地圖可以很好地滿足您的目的。
std::map < float, Event > event_map;
event_map.insert(std::make_pair(time, func_object));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.