2015-01-12 21 views
-1

我通過對第一值具有std::pair<T1, T2>類型的std::set含有值隨順序比較:的std ::設定的std ::對 - 如何編寫元件

struct Comparator 
{ 
    bool operator() (const std::pair<T1, T2>& lhs, const std::pair<T1, T2>& rhs) const 
    { 
     return lhs.first < rhs.first; 
    } 
} 

我的定義是std::set<std::pair<T1, T2>, Comparator> s

但是,當我嘗試插入具有相同的第一個值與元素插入到集之前(第二個值不同)的對。該集不會插入它。

我想std::set只處理元素的第二個值相等(或第一個和第二個相等)的地方。怎麼做??

P.S.我不想使用boost庫。

+4

「std :: pair」的默認比較如何不符合您的目的? –

+5

你描述的你想要的是什麼,你的比較似乎是兩回事。 –

+0

@RetiredNinja,我想要兩件事:我想'std :: set'與'std :: pair':1)按對的第一個值進行排序。 2)只要對中的第二個值相等(當然在插入元素時這很重要)。我的比較器只滿足第一個要求。 – peter55555

回答

2

但是,當我嘗試插入具有相同的第一個值與元素插入到集之前(第二個值不同)的對。該集不會插入它。

那麼,這就是你要求的。您的比較器僅查看first成員,而std::set不允許重複輸入。我想你可能要先按first成員排序,如果相等,則由second排序。因此,你的比較改變這樣的事情:

struct Comparator 
{ 
    bool operator() (const std::pair<T1, T2>& lhs, 
        const std::pair<T1, T2>& rhs) const 
    { 
     if (lhs.first == rhs.first) 
     return lhs.second < rhs.second; 
     else 
     return lhs.first < rhs.first; 
    } 
} 

請注意,這是默認的操作<std::pairwould do anyway所以如果你想要這個特定的順序,只使用默認。

+2

a.k.a.'return lhs >'而沒有自定義比較器,你將得到的行爲。 –

+0

@BenjaminLindley我的主要觀點是解釋比較定義如何引起觀察到的行爲。我不確定這是否真的是OP所要求的排序,但解決方案應該很容易轉移到其他排序中。不過,你的觀點是有效的。我也會補充一點。 – 5gon12eder

+0

@ 5gon12eder,不,我想按排序的第一個值排序。該集合的元素應該由該對的第二個值唯一確定。 – peter55555

-1

感謝您的回覆。所以,讓我們的任務更容易: 1)排序順序:lhs.first < rhs.first(所以我想按對的第一個元素排序)。 2)該集應該將對視爲相等(並且禁止插入),僅當:lhs.first == rhs.first & & lhs.second == rhs.second。

我想我很清楚自己想要什麼。

我正在使用CV Open Library編寫應用程序。我集被定義爲:

std::set<std::pair<double, cv::Point>, QComparator> s;

其中QComparator是:

struct QComparator 
{ 
    bool operator() (const std::pair<double, cv::Point>& lhs, const std::pair<double, cv::Point>& rhs) const 
    { 
     return lhs.first < rhs.first; 
    } 
}; 

附: 我將解釋什麼是CV ::點在簡歷庫:

typedef Point_<int> Point2i; 
typedef Point2i Point; 

如何做到這一點?

+0

這很奇怪,因爲當我嘗試使它在std :: set >時,它按預期工作...... – peter55555

相關問題