簡體   English   中英

C ++:使用std :: function在multiset中插入元組,並保持順序

[英]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::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));
}

這只是在這里寫的,它可以幫助人們,雖然很明顯,但仍然。

問題是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM