2013-04-02 84 views
1

很簡單,這段代碼有什麼問題?C++:在multiset中插入帶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功能包括一個名爲timedouble類型的值(注意這裏time變量無關,與時鐘或實際時間,它的類型是雙重的只是越來越對象) 。因此,當用戶添加某個事件時,它將在特定時間被調用。

該標準下的多容器容器將按某種順序(通常如果不是總是,則爲std::less<T>)整理對象。然後在容器上循環,我可以通過增加變量double time的變化來調用Event

什麼問題?

由於KyleC指出(見他的答案),std::function<>不是由編譯器在什麼進程理解爲訂購

我如何已經克服了這個問題

你學到新的東西每天。上面的代碼是通過最初混合std::multisetstd::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)); 
} 

這僅僅是寫在這裏的事件類似的東西,它可以幫助的人,雖然很明顯,但仍然。

+2

你能發佈錯誤的相關部分嗎? –

+0

@KyleC快速問題,你如何輸出編譯器錯誤到g ++中的文本文件? – woosah

回答

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)); 
+0

好點的應該知道的。在以下情況下你有什麼建議?該程序實時運行,並且'add_even_handler'函數包含一個名爲'time'的double類型的值。因此,當用戶添加某個事件時,它將在特定時間被調用。 (注意時間與時鐘無關,它只是一個增加的變量)。在一個multiset中,我認爲'tuple'的第一個元素會自動排序(這顯然是錯誤的,就像你說的那樣)。 – woosah

+0

你應該使用一個std :: map ,它應該適用於你,因爲float將是它將被排序的'key'。 –

+0

@woosah查看上面有關如何使用地圖的更新代碼。 –