假设我有一个Item
s 结构,我将其存储在 an 中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
任何帮助,将不胜感激!