簡體   English   中英

STL中使用的C ++自定義比較類型(函數謂詞與較少結構)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM