在本文中,我們提供了使用自訂比較器在std::set 容器中自訂比較條件的解決方案.
std::set 是唯一元素的有序集合,預設情況下,它按升序對元素進行排序。然而,我們可能想要定義自己的比較邏輯來改變這個行為。讓我們探討以下自訂比較器可能有用的場景:
在提供的範例中,我們打算將std::set 中整數的順序改為字典順序而不是數字。我們定義一個自訂比較器函數 lex_compare,它將每個整數轉換為字串表示形式,然後比較字串。但是,此程式碼無法編譯。
出現錯誤是因為提供的程式碼將自訂比較器函數 lex_compare 作為參數傳遞給 std::set 範本。但是, std::set 的第二個模板參數需要類型,而不是函數。為了解決這個問題,我們可以採用多種方法:
1.使用Lambda 函數作為比較器:
auto cmp = [](int64_t a, int64_t b) { return a < b; }; std::set<int64_t, decltype(cmp)> s;
在C 20 及更高版本中,我們可以直接使用lambda 函數作為比較器。 lambda 接受兩個參數(可比較的元素)並傳回一個布林值,指示它們的順序。
2.使用函數作為比較器:
bool cmp(int64_t a, int64_t b) { return a < b; } std::set<int64_t, decltype(&cmp)> s(&cmp);
如果不首選lambda 表達式,我們可以定義一個單獨的布林函數cmp 並將其傳遞給std::set 建構子。請注意,在這種情況下,我們需要提供取址運算子 (&) 來傳遞對函數的參考。
3.使用函數呼叫運算子的結構體:
struct cmp { bool operator()(int64_t a, int64_t b) { return a < b; } }; std::set<int64_t, cmp> s;
此方法定義具有實作比較邏輯的函數呼叫運算子的結構體。然後將該結構用作集合的比較器。
透過採用這些技術,我們可以有效地自訂 std::set 的排序行為以滿足特定要求。
以上是如何使用自訂比較器自訂 std::set 中的比較標準?的詳細內容。更多資訊請關注PHP中文網其他相關文章!