Я работаю над заданием, в котором мы должны запрограммировать несколько колод карт, которые могут взаимодействовать друг с другом с помощью векторов (например, удалить одну карту из основной колоды и добавить ее в другую). Присвоение состояний означает, что мы должны использовать перегруженный оператор «меньше чем» из нашей структуры карточек, чтобы определить правильный порядок карточек, комбинируя его с функцией 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 ().
Большое спасибо.
РЕДАКТИРОВАТЬ: забыл отметить проблему. Дополнительная информация в комментариях.
По умолчанию, 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);
}
Вы также можете упростить 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);
}