set能自动去重并保持有序,其底层通常采用红黑树实现;插入时通过比较操作查找位置,若元素已存在(即互不小于对方)则插入失败,从而保证唯一性;支持自定义类型需提供比较规则,适用于需要有序且唯一数据的场景。

在C++中,set 是一个非常实用的关联式容器,常用于自动去重和保持元素有序。它属于STL(标准模板库)的一部分,定义在 red"><set> 头文件中。
set 容器内部存储唯一且按升序排列的元素。默认情况下,使用 operator< 进行比较,因此元素必须支持比较操作。
常见操作示例:
代码示例:
立即学习“C++免费学习笔记(深入)”;
#include <set>
#include <iostream>
int main() {
std::set<int> s;
s.insert(5);
s.insert(3);
s.insert(5); // 重复,插入无效
for (const auto& x : s) {
std::cout << x << " "; // 输出:3 5
}
if (s.find(3) != s.end()) {
std::cout << "\n3 存在";
}
return 0;
}
set 能自动去重,根本原因在于其底层数据结构——通常实现为自平衡二叉搜索树(如红黑树)。
当调用 insert 插入元素时,set 会:
由于 set 要求元素“严格弱排序”,而“相等”被定义为:
两个元素 a 和 b 相等,当且仅当 a < b 为假 且 b < a 为假。
这与 == 不同,但能保证唯一性。
若要将自定义类型放入 set,必须提供比较方式。
可以通过重载 < 操作符,或传入比较函数对象。
示例:使用 struct 自定义比较
struct Person {
int age;
std::string name;
bool operator<(const Person& other) const {
return age < other.age; // 按年龄排序,自动去重
}
};
std::set<Person> people;
people.insert({25, "Alice"});
people.insert({25, "Bob"}); // 若只比 age,则视为重复
注意:上述例子中,两个 age=25 的 Person 可能被视为相同。若需更精确去重,应在比较逻辑中加入 name 或其他字段。
相比 vector 或 list,set 插入、删除、查找时间复杂度为 O(log n),虽然比哈希表慢,但能保持有序。
如果不需要排序,只想快速去重,可以考虑 unordered_set,它基于哈希表,平均操作为 O(1)。
基本上就这些。set 的去重能力来自其有序结构和插入时的重复检测机制,理解这一点有助于合理选择容器。
以上就是c++++ set容器用法 c++ set去重原理详解的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号