在C++标准模板库(STL)中,set 是一种基于平衡二叉搜索树(通常是红黑树)实现的容器,它存储的元素是唯一的,并按升序排列。set 定义在 <set> 头文件中。 主要特点- 唯一性:容器中的元素值是唯一的,不允许有重复的元素。
- 排序:元素按照关键字的顺序自动排列,通常是升序。
- 二叉搜索树:内部使用平衡二叉搜索树实现,提供对数时间的查找、插入和删除操作。
- 迭代器:提供双向迭代器,可以按顺序遍历容器中的元素。
主要操作- 构造:可以构造一个空的
set 或者使用一系列元素初始化。 - 插入:
insert 一个新元素。如果 set 中已存在相同的元素,则不会插入。 - 查找:
find 查找一个元素。 - 计数:
count 一个元素的个数,由于 set 中元素唯一,计数结果永远是1或0。 - 删除:
- 大小:
size 返回容器中元素的数量。 - 上界和下界:
- 范围:
equal_range 返回一个范围,包含所有与给定值相等的元素。
使用 std::set 的步骤- 包含头文件:使用 set 之前需要包含 <set> 头文件。
- 声明 set 实例:指定元素类型来声明 std::set 的实例。
- 初始化:可以默认构造一个空的 std::set,或者使用花括号 {} 初始化。
- 执行操作:使用 insert、find、erase 等方法操作集合。
示例代码#include <iostream>
#include <set>
int main() {
std::set<int> mySet;
// 向集合中插入元素
mySet.insert(10);
mySet.insert(5);
mySet.insert(20);
// 尝试插入重复元素
mySet.insert(10);
// 查找元素
auto it = mySet.find(15);
if (it != mySet.end()) {
std::cout << "Element found: " << *it << std::endl;
} else {
std::cout << "Element not found." << std::endl;
}
// 遍历集合并输出所有元素
for (int num : mySet) {
std::cout << num << ' ';
}
std::cout << std::endl;
// 删除元素
mySet.erase(5);
// 再次遍历集合并输出所有元素
for (int num : mySet) {
std::cout << num << ' ';
}
std::cout << std::endl;
return 0;
}
在这个示例中,我们创建了一个 std::set 的实例,并向其中插入了一些整数。然后,我们尝试插入一个已经存在的元素,set 会忽略这个操作。接着,我们使用 find 方法查找一个元素,并遍历集合输出所有元素。然后,我们使用 erase 方法删除一个元素,并再次输出集合中的元素。 注意事项std::set 中的元素默认是按升序排序的,如果需要降序或其他自定义排序,可以提供自定义比较函数。std::set 不支持随机访问,因为元素是有序存储的。std::set 的迭代器在插入或删除操作后可能会变得无效,需要小心处理。- 在多线程环境中使用
std::set 时,需要注意线程安全问题,因为 std::set 并不是线程安全的。
std::set 是实现关联容器的便捷方式,适用于需要保持元素唯一性并快速查找的场景。
(责任编辑:admin) |