std::set保证元素唯一性的核心机制在于其底层使用红黑树结构并结合排序规则。红黑树在插入时通过比较操作决定节点位置,若等于当前节点则不插入,从而避免重复;此外,红黑树的自平衡特性使操作复杂度稳定在o(log n)。自定义排序可通过提供比较函数改变排序逻辑,但必须满足严格弱序以确保正确判断唯一性。常见误区是若需存储重复值应使用std::multiset。实际应用中,存储自定义类型时需确保比较函数覆盖所有影响唯一性的字段。

C++ 中的
std::set

std::set
换句话说,红黑树的查找逻辑天然地避免了重复值的插入,这就实现了
set
立即学习“C++免费学习笔记(深入)”;

此外,红黑树还保持了树的平衡性,使得插入、删除、查找的时间复杂度稳定在 O(log n),这为
set
默认情况下,
std::set
operator<

例如:
struct MyCompare {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序排列
}
};
std::set<int, MyCompare> mySet;在这个例子中,虽然排序顺序变了,但唯一性的判断仍然是通过比较函数来完成的。只要你的比较函数满足严格弱序(strict weak ordering),
set
⚠️ 注意:如果你的比较函数没有正确处理相等关系,可能会导致 set 行为异常,比如误判重复或者漏判重复。
所以,自定义排序的关键点是:
operator==
<
有些初学者可能会疑惑:“如果我想存多个相同值怎么办?”这时候应该考虑使用
std::multiset
set
multiset
set
multiset
因此,如果你确实需要存储重复项,请选择
multiset
有时候我们想存储自定义类型对象到
set
operator<
举个例子:
struct Person {
std::string name;
int age;
};
struct ComparePerson {
bool operator()(const Person& a, const Person& b) const {
if (a.name != b.name) return a.name < b.name;
return a.age < b.age;
}
};
std::set<Person, ComparePerson> people;这样设置后,只有当两个人的姓名和年龄都完全相同时,才会被视为重复,不会被插入。
基本上就这些。理解
set
以上就是C++ set容器如何保证唯一性 红黑树实现与自定义排序的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号