C std :: lower_bound, использовать перегруженный оператор в качестве двоичного предиката 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);
}

А перегруженный оператор «меньше чем» структуры 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

Решение

По умолчанию, 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);
}

(что также исправляет небольшую ошибку в вашем коде).

2

Другие решения

Тебе нужно

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

По вопросам рекламы [email protected]