阅读量:0
要自定义 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 函数,来实现自定义的排序规则。