如何自定義 C++ Set 的排序規(guī)則

c++
小樊
86
2024-08-09 01:13:42

要自定義 C++ Set 的排序規(guī)則,可以通過(guò)傳遞一個(gè) lambda 函數(shù)或者函數(shù)對(duì)象作為 Set 的比較函數(shù)來(lái)實(shí)現(xiàn)。比如,如果要按照字符串長(zhǎng)度遞增的順序排序 Set,可以這樣實(shí)現(xiàn):

#include <iostream>
#include <set>
#include <string>

struct CompareStringByLength {
    bool operator() (const std::string& a, const std::string& b) const {
        return a.length() < b.length();
    }
};

int main() {
    std::set<std::string, CompareStringByLength> stringSet;

    stringSet.insert("hello");
    stringSet.insert("world");
    stringSet.insert("c++");

    for (const auto& str : stringSet) {
        std::cout << str << std::endl;
    }

    return 0;
}

在這個(gè)例子中,我們定義了一個(gè)名為 CompareStringByLength 的函數(shù)對(duì)象,它重載了 () 運(yùn)算符,用來(lái)比較兩個(gè)字符串的長(zhǎng)度。然后將這個(gè)函數(shù)對(duì)象作為 Set 的第二個(gè)模板參數(shù)傳遞給 Set,即 std::set<std::string, CompareStringByLength> stringSet;。這樣 Set 就會(huì)使用 CompareStringByLength 中定義的比較規(guī)則來(lái)排序元素。

除了函數(shù)對(duì)象之外,還可以通過(guò) lambda 函數(shù)來(lái)實(shí)現(xiàn)自定義的排序規(guī)則,如:

#include <iostream>
#include <set>
#include <string>

int main() {
    auto compareStringByLength = [](const std::string& a, const std::string& b) {
        return a.length() < b.length();
    };

    std::set<std::string, decltype(compareStringByLength)> stringSet(compareStringByLength);

    stringSet.insert("hello");
    stringSet.insert("world");
    stringSet.insert("c++");

    for (const auto& str : stringSet) {
        std::cout << str << std::endl;
    }

    return 0;
}

這里我們使用了 lambda 函數(shù) compareStringByLength,并在 Set 的構(gòu)造函數(shù)中傳遞了這個(gè) lambda 函數(shù),來(lái)實(shí)現(xiàn)自定義的排序規(guī)則。

0