首頁 > 後端開發 > C++ > 如何使用自訂比較器自訂 std::set 中的比較標準?

如何使用自訂比較器自訂 std::set 中的比較標準?

Linda Hamilton
發布: 2024-12-20 17:25:10
原創
648 人瀏覽過

How to Customize the Comparison Criteria in a std::set Using Custom Comparators?

如何將自訂比較器與std::set 一起使用

在本文中,我們提供了使用自訂比較器在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板