使用自訂比較器編譯集
嘗試建立一組按字典比較而不是數字排序的整數時,編譯時可能會出現問題with g .
遇到的錯誤是由於集合的模板參數類型不正確造成的。在提供的程式碼中:
set<int64_t, lex_compare> s;
lex_compare 不是型別而是函數。為了解決這個問題,我們需要根據 C 的模板要求來建立一個比較器物件。
現代C 解
1. C 20 解:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s;
Lambda中的比較器。 lambda 應傳回布林值,指示元素的順序。
2 。 C 11 解:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s(cmp);
在 C 11 中,lambda 必須作為參數傳遞給集合建構子。
傳統解
3。函數指標:
bool cmp(int64_t a, int64_t b) { return ...; } std::set<int64_t, decltype(cmp)*> s(cmp);
4.使用Operator() 進行結構:
struct cmp { bool operator() (int64_t a, int64_t b) const { return ... } }; std::set<int64_t, cmp> s;
5.布林函數的結構:
bool cmp(int64_t a, int64_t b) { return ...; } #include <type_traits> using Cmp = std::integral_constant<decltype(&cmp), &cmp>; std::set<int64_t, Cmp> set;
以上是如何在 C 中正確編譯帶有自訂比較器的集合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!