[英]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.