作者:嘻嘻2502891803 | 来源:互联网 | 2022-11-28 15:17
为什么我不能有一个std::set
或std::unordered_set
的std::function
S'
有什么方法可以让它工作吗?
1> Christophe..:
你可以很好地创建一个std::set
函数.问题是集合要求在其元素的值之间存在绝对顺序.此顺序由比较器定义,然后比较器用于对集合的元素进行排序,检查元素是否已存在,以及返回特定元素.
不幸的是,函数之间不存在顺序.假设,你有两个函数f1()
和f2()
,会是什么意思f1 ?
也没有真正定义平等.例如,如果你有
int fun1(int) { return 1; }
int fun2(int) { return 1; }
function f1=fun1, f2=fun2;
如果你将f1和f2插入一个集合(因为它总是相同的结果),或者它是不同的东西(因为即使它们具有相同的主体,它是不同的功能),f1和f2应该是相同的值吗?
当然,您可以欺骗编译器让它相信您已经定义了一个订单:
struct Comp {
using T = function;
bool operator()(const T &lhs, const T &rhs) const
{
return &lhs <&rhs;
}
};
set ,Comp> s;
然后,您可以在集合中插入函数.但这不会很好,因为你获取元素的地址,如果交换相同的元素,顺序是不同的.
我认为最好的方法是使用包含定义id的成员字符串的包装器,并使用此id对集合中的元素进行排序(或者在进行散列时进行散列unordered_set
)