2014-06-15 73 views
2

我試圖建立一個std::set與一個自定義的命令來存儲「任務」內,我想知道是否有可能得到什麼我需要一個簡單的std容器。一套自定義比較仿函數,在相等的情況下可預測

設定是這樣的:

std::set<Task*, CompareTasks> taskList; 

而且class Task有一個公共double priority成員。

我需要什麼:

  • 編輯:每個任務Task *必須taskList
  • 任務中是唯一的,必須在降低priority進行排序。
  • 如果task2恰好共享同一個prioritytask1已經在列表中,然後「先到先得」:task2必須task1之後插入

我試圖用仿函數:

class CompareTasks 
{ 
public: 
    bool operator()(Task* const& a, Task* const& b) 
    { 
     return a->priority < b->priority; 
    } 
}; 

但任務然後我插入,有一個已經記錄priority,只是..根本不插入。因此,我懷疑taskList的鍵是它們本身的優先級,而不是std::set<Task*, CompareTasks>中寫的指針值Task*。我如何檢查是否是這種情況?

更富戲劇性的是:由於訂貨必須在創建比較函數子std容器,有沒有什麼辦法,我就可以只用std::set實現這一目標?

回答

4

當您提供比較器時,std::set的等效定義爲!comp(a,b) && !comp(b,a)。使用您的比較功能,您將無法以相同的優先級插入兩個Task *,因爲它們與該定義相同。

你想要的是std::multiset - 特別是C++ 11 std::multiset,因爲它的insert()有不包括C++ 03(ref這樣的保證,這是由§23.2.4[associative.reqmts],表要求標準的102):

如果容器包含具有等效鍵的元素,則插入該範圍的上限。

這意味着新插入的元素將始終位於容器中已有的等效元素之後。

請注意,標準的有序關聯容器按非降序排序,因此如果您希望通過降低優先級來排序任務,則需要更改仿函數。

+0

好吧,這是來自C++ 11的一個不錯的保證,我會嘗試一個multiset。謝謝!^^我只是想知道這個'std :: set '的非常*鍵*:它們應該指向任務而不是優先級,對吧?然後兩個具有相同'priority'的'Task'應該有兩個不同的'Task *'地址,因此不能被認爲是「複製的」。這個推理有什麼問題? –

+0

好吧,我認爲它越來越清晰:他們*有*不同的鍵,但他們被認爲是「等效」,因爲我提供了這個比較器..棘手的把戲:P –

+0

好吧,它現在可以用multiset工作,但我感覺我在戰鬥中失去了一些東西:我如何確定在'std :: multiset taskList'中沒有兩次插入相同的Task *'?我需要自己處理嗎?這就是在第一個地方使用一個簡單的'std :: set'的完整點。:\ –

相關問題