gpt4 book ai didi

c++ - 我可以扩展 std::map::lower_bound 以搜索非 key_type 参数吗?

转载 作者:行者123 更新时间:2023-11-28 04:26:59 26 4
gpt4 key购买 nike

这是我的情况的说明。我有一个 std::map我想找到第一个 pair<key,value>其中 key 是 key 等价类的任何成员。

#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_boundmap::upper_bound只拿一个key_type (即 Key )参数。我无法获得 std::lower_bound编译,我看到它需要一个 LegacyForwardIterator但我很难解释这个规范。

Key而言因为我的 map 是订购的,Key具有与 Category 兼容的排序,即:k<c当且仅当 k.category<c , 所以我的要求似乎合乎逻辑。

在真实情况下,Key类更复杂,并且分离质量/类别组件(为了使用 map<category,map<quality,value>> 解决方案)实际上不会奏效,以防您正在考虑这种情况。

如何在我的 map 中找到其键等于某个非键值的元素范围的下限(和上限)?

最佳答案

C++14 引入了透明比较器的概念,可以在其中使用findlower_boundupper_bound , ... 任何可以与键类型进行比较的东西,只要比较器明确选择了这种行为。

在您的情况下,您需要添加自定义比较器

struct KeyComparator {
// opt into being transparent comparator
using is_transparent = void;

bool operator()(Key const& lhs, Key const& rhs) const {
return lhs < rhs;
}

bool operator()(Key const& lhs, Category const& rhs) const {
return lhs.category < rhs;
}

bool operator()(Category const& lhs, Key const& rhs) const {
return lhs < rhs.category;
}
};

然后您需要在您的 Container

中使用它
typedef std::map <Key, Value, KeyComparator> Container;

Live demo

关于c++ - 我可以扩展 std::map::lower_bound 以搜索非 key_type 参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com