Вот иллюстрация моей ситуации. У меня есть std::map
, и я хочу найти первый pair<key,value>
, где ключ - это любой член класса эквивалентности ключей.
#include <map>
struct Category
{
int foo;
int bar;
bool operator < (const Category & rhs) const;
bool operator > (const Category & rhs) const;
};
struct Key
{
Category category;
float quality;
bool operator < (const Key & rhs) const
{
if (category < rhs.category)
return true;
else if (category > rhs.category)
return false;
else
return quality < rhs.quality;
}
};
struct Value {};
typedef std::map <Key, Value> Container;
Container::iterator find_low_quality
(
Container & container,
const Category & category
)
{
return container.lower_bound (category);
}
Container::iterator find_high_quality
(
Container & container,
const Category & category
)
{
// some checks need to be done, here omitted for brevity
return --container.upper_bound (category);
}
Это не работает, потому что map::lower_bound
и map::upper_bound
принимают только аргумент key_type
(т.е. Key
). Я не смог заставить std::lower_bound
скомпилировать, я вижу, что он ожидает LegacyForwardIterator
, но мне трудно интерпретировать спецификацию для этого.
Поскольку заказано Key
для моей карты, Key
имеет совместимый порядок с Category
, а именно: k<c
тогда и только тогда, когда k.category<c
, поэтому мои требования, кажется, имеют логический смысл.
В реальной ситуации класс Key
является более сложным, и разделение компонентов качества / категории (для использования решения map<category,map<quality,value>>
) на самом деле не сработает, если это то, что вы думать о.
Как найти нижние (и верхние) границы диапазона элементов в моей карте, ключи которых эквивалентны некоторому неключевому значению?