C std :: lower_bound,使用重载运算符作为二进制谓词comp?

时间:2013-10-31 17:05:27

标签: c++ vector operator-overloading lower-bound

我正在进行一项任务,我们必须使用矢量对可以互相交互的多副牌进行编程(例如从主牌中移除一张牌并将其添加到另一张牌中)。赋值声明我们必须使用卡结构中的重载“小于”运算符,通过将它与std :: lower_bound函数组合来确定卡的正确顺序。到目前为止,这就是我所拥有的:

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);
}

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()”方法。

非常感谢。

编辑:忘记标记问题了。评论中的额外信息。

2 个答案:

答案 0 :(得分:2)

默认情况下,std::lower_bound对迭代器后面的类型使用less-than运算符。通过定义自己的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);
}

(这也修复了代码中的细微错误。)

答案 1 :(得分: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);
}