为什么我不能使用 std::function 作为 std::set 或 std::unordered_set 值类型?

2024-01-04

为什么我不能有一个std::set or std::unordered_set of std::functions?

有什么办法让它发挥作用吗?


你可以很好地创建一个std::set https://en.cppreference.com/w/cpp/container/set的功能。问题在于集合要求其元素值之间存在绝对顺序。此顺序由比较器定义,然后用于对集合的元素进行排序、检查元素是否已存在以及查找特定元素。

不幸的是,函数之间不存在顺序。假设你有两个函数f1() and f2(),这意味着什么f1 < f2 ?

平等也没有真正定义。例如,如果您有

int fun1(int) { return 1; }
int fun2(int) { return 1; }
function<int(int)> f1=fun1, f2=fun2; 

如果将 f1 和 f2 插入到一个集合中,f1 和 f2 应该是相同的值(因为它总是相同的结果),还是不同的值(因为即使它们具有相同的主体,它也是不同的函数)?

当然,您可以欺骗编译器,让它相信您已经定义了一个顺序:

struct Comp {
    using T = function<int(int)>;
    bool operator()(const T &lhs, const T &rhs) const 
    {
        return &lhs < &rhs;
    }
};

set <function<int(int)>,Comp> s; 

然后您可以在集合中插入函数。但这不会很好地工作,因为你获取元素的地址,如果交换相同的元素,则顺序不同。

我认为最好的方法是使用一个包含定义 id 的成员字符串的包装器,并使用该 id 对集合中的元素进行排序(或者在出现以下情况时进行哈希处理):unordered_set)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能使用 std::function 作为 std::set 或 std::unordered_set 值类型? 的相关文章

随机推荐