我正在进行一项任务,我们必须使用矢量对可以互相交互的多副牌进行编程(例如从主牌中移除一张牌并将其添加到另一张牌中)。赋值声明我们必须使用卡结构中的重载“小于”运算符,通过将它与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()”方法。
非常感谢。
编辑:忘记标记问题了。评论中的额外信息。答案 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);
}