Допустим, у меня есть структура Item
s, которую я храню в std::set
и сортирую так:
struct Position
{
int x;
int y;
}
struct Item
{
std::string id;
Position position;
// NOTE: only `position` should matter for equality
operator==(const Item& other)
{
return position == position;
}
};
inline bool operator<(const Item& lhs, const Item& rhs)
{
if (lhs.position.x == rhs.position.x)
{
return lhs.position.y < rhs.position.y;
}
return lhs.position.x < rhs.position.x;
}
using ItemSet = std::set<Item>;
Я хочу использовать std::equal_range
для поиска ItemSet
, за исключением того, что я хочу искать по Position
. Я знаю, что могу сделать что-то вроде:
ItemSet items;
Item tempItem;
tempItem.position = some_position;
auto result = std::equal_range(items.begin(), items.end(), tempItem);
Но я бы хотел избежать временного Item
.
Я пытался использовать boost::transform_terator
вот так:
auto tr = [](const Item& item) { return item.pos; };
auto tr_begin = boost::make_transform_iterator(items.begin(), tr);
auto tr_end = boost::make_transform_iterator(items.end(), tr);
Position findme { 2, 1 };
auto result = std::equal_range(tr_begin, tr_end, findme);
Но это не компилируется по причинам, которых я не понимаю, и даже если бы это сработало, как мне получить итератор в исходную коллекцию из result
? Или, может быть, есть лучший способ сделать это в целом?
Вот тестовый жгут, показывающий проблему: http://cpp.sh/3hzsq
Любая помощь будет принята с благодарностью!