2013-10-31 52 views
0

我正在做一個任務,我們必須編寫多個可以使用矢量互相交互的副牌(例如,從主牌中移除一張牌並將其添加到另一張牌)。賦值狀態表明我們必須在卡片結構中使用一個重載「小於」運算符,通過將它與std :: lower_bound函數結合來確定卡的正確順序。到目前爲止,這是我的:C std :: lower_bound,使用重載操作符作爲二進制謂詞comp?

void CardDeck::Add(const Card& card) 
{ 
    m_Cards.insert(std::lower_bound(m_Cards.begin(),m_Cards.end(),card,*insert smaller than operator here*),card); 
} 

而卡結構的重載「小於」運算符如下。它根據枚舉中的預定順序比較排名和牌的套數:

friend bool operator< (const Card& lhs, const Card& rhs) 
{ 
    if(lhs.m_Suit < rhs.m_Suit || (lhs.m_Suit == rhs.m_Suit && lhs.m_Rank < rhs.m_Rank)) 
    { 
     return true; 
    } 
} 

任何幫助,非常感謝。賦值狀態我們必須使用重載操作符。我們不允許製作一個簡單的「IsSmallerThan()」方法。

非常感謝。

編輯:忘記標記問題。評論中的額外信息。

+1

你的問題是什麼? (除了多餘的逗號) –

+0

那麼這有什麼問題?這是一個錯誤嗎?編譯器錯誤? – bstamour

+1

另外,請注意,當條件爲false時,您不會返回運算符 bstamour

回答

2

默認情況下,std::lower_bound對迭代器後面的類型使用小於運算符。通過定義你自己的operator <,lower_bound應該做正確的事情。即調用它像這樣

std::lower_bound(m_cards.begin(), m_cards.end(), card); 

應該可以正常工作,給卡類型定義一個適當的operator <

有一點需要指出的是您operator <代碼可以簡化爲

friend bool operator< (const Card& lhs, const Card& rhs) 
{ 
    return lhs.m_Suit < rhs.m_Suit || 
     (lhs.m_Suit == rhs.m_Suit && lhs.m_Rank < rhs.m_Rank); 
} 

(其中還修復了一個微妙的錯誤在你的代碼)。

+0

提供嚴格的弱排序,並且不需要爲'm_Suit'數據類型提供'operator ==',or-子句右邊的第一部分應該讀爲'(!(rhs.m_Suit WhozCraig

+0

好的,非常感謝! – Emvidasch

+0

@WhozCraig我想保留它只是清洗問題中提出的內容。榮譽指出正確的方式來執行嚴格的弱排序:-) – bstamour

1

如果你想真正提供一個比較需要

void CardDeck::Add(const Card& card) 
{ 
    m_Cards.insert(std::lower_bound(m_Cards.begin(),m_Cards.end(),card,std::less<Card>()),card); 
} 

。由於默認已經用上面的,你也可以簡單地離開它:

void CardDeck::Add(const Card& card) 
{ 
    m_Cards.insert(std::lower_bound(m_Cards.begin(),m_Cards.end(),card),card); 
} 

您還可以簡化您的operator<(並使其更不容易出錯)通過使用std::tie

friend bool operator< (const Card& lhs, const Card& rhs) 
{ 
    return std::tie(lhs.m_Suit, lhs.m_Rank) < std::tie(rhs.m_Suit, rhs.m_Rank); 
} 
+0

+1爲答案,我希望我能再次投票這個使用'std :: tie'(愛那件事)。 – WhozCraig