我试图理解以下两种情况的区别。在这两种情况下,我都将比较器作为lambda函数引入:
auto comp = [](int x, int y) { return x%2 < y%2; };
但是,如果我想将它与排序一起使用,我可以简单地写
sort(vec.begin(), vec.end(), comp);
而对于在比较器上模板化的类,例如priority_queue,我需要一个包装器:
priority_queue<int, decltype(comp)> my_queue;
作为模板参数传递。
sort函数本身是在比较器类上模板化的,但它在没有decltype的情况下也能工作。是否存在适用于sort
的隐式转换,但在第二种情况下不起作用?
这些都是关于模板参数推导的。您正在调用的std::sort
的重载声明为
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
和
sort(vec.begin(), vec.end(), comp);
编译器通过模板实参推导步骤,根据传递给函数的变量类型确定RandomIt
和Compare
是什么。
在priority_queue
的情况下,你没有得到这个,因为没有变量来推断类型。因此你必须自己指定模板参数。
也就是说,从c++ 17开始,我们现在有了类模板实参推导(CTAD),可以使用提供给构造函数的实参来推导类的模板形参。例如,如果您希望priority_queue
使用std::vector<int>
作为底层容器,并使用comp
保持顺序,那么您可以使用
priority_queue my_queue(comp, std:vector<int>{});