std::set
是 C++ 标准库中的一个关联容器,它包含一组唯一的对象。这些对象按照字典序进行排序,也可以通过自定义比较器来改变排序规则。自定义比较器通常是一个函数对象(也称为仿函数),它重载了 operator()
来定义排序逻辑。
std::set
实例之间共享,提高了代码的可重用性。自定义比较器可以是函数对象、函数指针或 lambda 表达式。在 C++11 及以后的版本中,lambda 表达式因其简洁性和灵活性而广受欢迎。
std::set
本身具有去重功能,结合自定义比较器可以实现更复杂的去重逻辑。std::set
结合自定义比较器可以作为一个很好的基础。以下是一个使用自定义比较器的 std::set
示例:
#include <iostream>
#include <set>
// 自定义比较器
struct MyComparator {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序排序
}
};
int main() {
// 使用自定义比较器创建 std::set
std::set<int, MyComparator> mySet;
// 插入元素
mySet.insert(3);
mySet.insert(1);
mySet.insert(4);
mySet.insert(1); // 重复元素,不会被插入
// 输出元素
for (const auto& elem : mySet) {
std::cout << elem << " ";
}
return 0;
}
4 3 1
问题:自定义比较器没有正确应用,std::set
仍然按照默认的字典序排序。
原因:
operator()
函数。std::set
时没有指定自定义比较器。解决方法:
operator()
函数,并返回正确的比较结果。std::set
时,显式指定自定义比较器作为第二个模板参数。std::set<int, MyComparator> mySet; // 显式指定自定义比较器
通过以上内容,你应该能够理解如何通过自定义构造函数为 std::set
使用自定义比较器,并解决相关问题。
领取专属 10元无门槛券
手把手带您无忧上云