[英]C++ custom Compare types used in STL (function predicate vs. less struct)
我已经检查了std :: sort和std :: priority_queue的原型,模板中定义的自定义Compare类型看起来完全一样。
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
但是实际上它们是不同的,std :: sort接受函数谓词,而std :: priority_queue接受struct(类型)。 为什么? 提前致谢!。
struct cmp {
bool operator() (const int &a, const int &b) {
return a < b;
}
};
vector<int> v;
v.push_back(2);
v.push_back(3);
v.push_back(1);
// this works
sort(v.begin(), v.end(), [](const int &a, const int &b) -> bool {
return a < b;
});
// this not works
// sort(v.begin(), v.end(), cmp);
cout << v[0] << endl;
// this works
priority_queue<int, cmp> q;
// this not works
// priority_queue<int, [](const int &a, const int &b) -> bool {
// return a < b;
// }> q;
q.push(2);
q.push(3);
q.push(1);
cout << q.top() << endl;
区别在于sort
是函数模板,因此可以从函数参数的类型推导Comparator
的模板参数。 当您这样称呼它时:
sort(v.begin(), v.end(), [](const int &a, const int &b) -> bool {
return a < b;
});
然后推导Comparator
的参数为lambda闭包对象的类型 。
另一方面, priority_queue
是一个类模板。 没有类型推断。 您可以使用q
的类型为Compare
指定模板参数,然后,您只能提供适当类型的函数参数(给构造函数)。
要将lambda与优先级队列一起使用,您需要掌握其类型:
auto compare = [](const int &a, const int &b) -> bool {
return a < b;
};
std::priority_queue<int, std::vector<int>, decltype(compare)> q(compare);
您试图将lambda 表达式作为参数传递给模板类型参数。 这行不通。 用sort
做同样的事情也不起作用:
sort<vector<int>::iterator, [](const int &a, const int &b) -> bool {
return a < b;
}>(/*...*/);
它们实际上是相同的,区别在于一个是类模板,另一个是函数模板。
您可以使用优先级队列执行以下操作:
auto comp = [](const int& a, const int& b) { return a < b; };
priority_queue<int, std::vector<int>, decltype(comp)> q(comp);
区别在于,对于函数模板,编译器将从提供的函数参数中推断出模板参数,而对于类模板则不这样做。 因此,您必须显式提供该类型,并使用lambda(具有匿名类型),这很烦人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.