c – 为什么STL设置比较器仅通过模板指定?
发布时间:2020-12-16 10:05:45 所属栏目:百科 来源:网络整理
导读:向std :: set容器提供自定义比较器的唯一方法是通过模板特化.这意味着比较器细节将泄漏给该组的所有用户.有没有办法绕过它以及为什么做出如此奇怪的决定选择?我不应该有一个方法可以返回一个按我喜欢的方式订购的一套,但没有人知道订购的是什么吗? 解决方
向std :: set容器提供自定义比较器的唯一方法是通过模板特化.这意味着比较器细节将泄漏给该组的所有用户.有没有办法绕过它以及为什么做出如此奇怪的决定选择?我不应该有一个方法可以返回一个按我喜欢的方式订购的一套,但没有人知道订购的是什么吗?
解决方法
对于许多用途,默认的比较选择,即使用std :: less< T>.它使用< b效果很好.此比较不执行任何动态分派,这将允许在不影响类型的情况下选择顺序,因为动态分派可能会导致性能下降.添加动态调度肯定会在界面定义时导致性能下降,我认为它仍然是真的,不太可能完全消失. 如果你想在不影响类型的情况下选择顺序,你可以使用std :: function< bool(T const&,T const&)> (或std :: function< bool(T,T)>如果T碰巧是一种便宜的复制类型,如内置类型).在这种情况下,您需要将比较对象指定为构造函数参数.例如:
std::set<int,std::function<bool(int,int)>> values{std::less<int>()}; 请注意,上面的代码使用curlies,否则它将是一个函数声明而不是一个对象定义.另请注意,分配std:set< int,std :: function< bool(int,int)>>到具有不同比较功能的另一个不起作用:代码将编译但是赋值将创建一个错误排序的集合.例如: #include <functional> #include <iostream> #include <set> int main() { std::set<int,int)>> values1{std::less<int>()}; values1.insert(1); values1.insert(2); values1.insert(3); std::set<int,int)>> values2{std::greater<int>()}; values2 = values1; for (auto v: values2) { std::cout << v << 'n'; } } 这将按升序打印值,尽管它应按降序打印. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |