要自定义 C++ Set 的排序规则,可以通过传递一个 lambda 函数或者函数对象作为 Set 的比较函数来实现。比如,如果要按照字符串长度递增的顺序排序 Set,可以这样实现:
#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;
}
在这个例子中,我们定义了一个名为 CompareStringByLength 的函数对象,它重载了 () 运算符,用来比较两个字符串的长度。然后将这个函数对象作为 Set 的第二个模板参数传递给 Set,即 std::set<std::string, CompareStringByLength> stringSet;。这样 Set 就会使用 CompareStringByLength 中定义的比较规则来排序元素。
除了函数对象之外,还可以通过 lambda 函数来实现自定义的排序规则,如:
#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 函数 compareStringByLength,并在 Set 的构造函数中传递了这个 lambda 函数,来实现自定义的排序规则。