要自定義 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ī)則。