2011-06-09 38 views
0

這是我以前的post的延續,告訴我該做什麼很好,但實施它沒有工作:S。我只想在C++算法類中使用set_union(和其他集合操作)來處理我的結構。這是迄今爲止我所擁有的。set_union關於任意結構 - 我哪裏出錯了?

我的結構:

struct player { 
    int lbl; 
    int lbl1; 

    bool operator<(const player &t) const { 
     return (lbl < t.lbl && lbl1 < t.lbl); 
    } 
}; 

定義在我的結構,即一個球員<運營商比其他球員「小」如果它的兩個標籤(整數)的比其他玩家的標籤更小。

然後執行我這樣做的set_union:

player p1; 
    p1.lbl = 1; 
    p1.lbl1 = 3; 

    player p2; 
    p2.lbl = 3; 
    p2.lbl1 = 5; 

    player p3; 
    p3.lbl = 2; 
    p3.lbl1 = 8; 

    player p4; 
    p4.lbl = 1; 
    p4.lbl1 = 7; 

    vector<player> v1; 
    vector<player> v2; 
    v1.push_back(p2); 
    v1.push_back(p1); 
    v2.push_back(p3); 
    v2.push_back(p4); 

    sort(v1.begin(), v1.end()); 
    sort(v2.begin(), v2.end()); 

    vector<player> v; 
    set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), 
       back_inserter(v)); 

    for(int i = 0; i < v.size(); i++) { 
     cout << v.at(i).lbl << ", " << v.at(i).lbl1 << endl; 
    } 

它打印:

1, 3 
3, 5 

時候應該已經印

1, 3 
3, 5 
2, 8 
1, 7 

,因爲它的成立工會。我可能在結構定義的某個地方出錯了?同樣的set_union對字符串和整數的向量都有效,所以它可能是我的玩家結構?

謝謝。

附加代碼

我的實際結構的代碼是下面(與由納瓦茲建議更正)。我最初發布的簡化版本,但我可能需要張貼這一切:

struct player { 
    int i; 
    int lbl; 
    int lbl1; 
    argument argu; 
    string player_name; 

    player(string player_name); 

    bool operator<(const player &t) const { 
     if (lbl != t.lbl) 
      return lbl < t.lbl; 
     return lbl1 < t.lbl1; 
    } 

}; 
+0

不要附加問句C++和C ...他們是兩種不同的語言,並且更加容易,當你選擇一個或另一個(使用雖然你可以* *代碼都是理論上的)。 – 2011-06-09 19:47:30

回答

7

你應該實現Strict weak ordering,因爲關聯容器std::setstd::multisetstd::mapstd::multimap要求元素的順序必須是Strict Weak Ordering。在你的情況下,set_union根據std::set規則對數據進行操作,這要求嚴格弱排序但您的比較函數沒有實現它。因此,問題!

還要注意什麼the documentation of std::set_union在CPLUSPLUS說,

比較函數對象,採取同樣的類型比包含在範圍內的兩個值,返回true,如果第一個參數的第二個參數之前去具體的嚴格弱排序它定義,否則爲false。

所以,你的比較函數應該是這樣的:

struct player { 
    int lbl; 
    int lbl1; 

    bool operator<(const player &t) const 
    { 
     if (lbl != t.lbl) 
       return lbl < t.lbl; 
     return lbl1 < t.lbl1; 
    } 
}; 

這將給予正確的輸出。看到這個在線演示:

http://www.ideone.com/d4Kob

+0

@Nawaz,還有,爲什麼嚴格的弱排序需要?我之前應該聽說過嗎? – ale 2011-06-09 20:09:39

+0

@Nawaz讓我用一個更有意義的代替我的第一條評論:「謝謝:)我的代碼仍然不工作!在我的實際代碼中,我有一個字符串和一個字符串的向量以及結構體中的兩個標籤?我沒有在帖子中包含它們,因爲它們不用於比較玩家,任何想法?再次感謝。「 – ale 2011-06-09 20:25:28

+0

@ vivid-colours:我不明白你的問題?什麼實現仍然不起作用?你是否執行嚴格的弱排序? – Nawaz 2011-06-09 20:31:41