C std::lower_bound,使用重载运算符作为二进制谓词组合
C std::lower_bound, use overloaded operator as Binary predicate comp?
我正在做一项任务,我们必须编写多副牌,这些牌可以使用向量相互交互(例如,从主牌组中移除一张牌并将其添加到另一副牌中)。赋值指出,我们必须使用卡结构中重载的"小于"运算符,通过将其与 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);
}
相关文章:
- 为什么比较运算符如此快速
- std::condition_variable::wait()如何评估给定的谓词
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- C std::lower_bound,使用重载运算符作为二进制谓词组合
- 使用运算符!对重载的布尔谓词求反