金铲铲之战辅助网站,C++STLset如_
cpp
struct CaseInsensitiveLess {
bool operator()(const string& a, const string& b) const {
return lexicographical_compare(
a.begin(), a.end(),
b.begin(), b.end(),
[](char c1, char c2) {
return tolower(c1) < tolower(c2);
});
}
};set
关键注意事项
:
1. 比较函数必须满足严格弱序(Strict Weak Ordering):
- 非自反性:comp(x,x) == false
- 非对称性:comp(x,y) == true ⇒ comp(y,x) == false
- 可传递性:comp(x,y)&&comp(y,z) ⇒ comp(x,z) 破坏严格弱序将导致未定义行为:
cpp // 错误的比较函数示例 struct BadCompare { bool operator()(int a, int b) { return abs(a) <= abs(b); // 违反非自反性 } };四、
节点插入规则:
若树为空 :直接作为根节点(黑色) 存在等价节点:放弃插入(返回pair.second=false) 无等价节点:按BST规则插入新节点(红色) 通过旋转和变色维持平衡cpp // 典型的插入过程伪代码 template
三 、红黑树从根节点开始 ,需要同时掌握红黑树的金铲铲之战辅助网站结构特性和严格弱序比较的数学原理。开发者可以构建适应各种业务场景的金铲铲发卡网高效去重容器
。一、则判定为重复
。优先比较哈希值或关键字段 避免动态内存分配
:在比较函数中使用引用而非值传递 定制allocator:配合内存池提升节点创建效率
cpp struct EmployeeCompare { bool operator()(const Employee& a, const Employee& b) const { // 优先比较最易区分的字段 if (a.department != b.department) return a.department < b.department; return a.employee_id < b.employee_id; } };
五、与其他容器的对比
| 特性 | set | unordered_set | multiset |
|--------------------|--------------|---------------|--------------|
| 底层结构 | 红黑树 | 哈希表 | 红黑树 |
| 元素唯一性 | 严格唯一 | 严格唯一 | 允许重复 |
| 自定义比较支持 | 完全支持 | 仅哈希函数 | 同set |
| 典型时间复杂度 | O(log n) | O(1) | O(log n) |结语
理解set的唯一性实现机制 ,set会通过底层数据结构和比较规则自动过滤
