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

C std::lower_bound, use overloaded operator as Binary predicate comp?

本文关键字:运算符 谓词 组合 重载 二进制 lower std bound      更新时间:2023-10-16

我正在做一项任务,我们必须编写多副牌,这些牌可以使用向量相互交互(例如,从主牌组中移除一张牌并将其添加到另一副牌中)。赋值指出,我们必须使用卡结构中重载的"小于"运算符,通过将其与 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);
}

而卡结构体的重载"小于"运算符如下。它根据枚举中的预定顺序比较牌的等级和花色:

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

任何帮助将不胜感激。赋值声明我们必须使用重载运算符。我们不允许自己制作一个简单的"IsSmallThan()"方法。

非常感谢。

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

默认情况下,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);
}

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

你需要

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

您还可以通过使用std::tie来简化operator<(并使其不易出错):

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