set是C++标准模板库(STL)提供的一种关联容器,用于存储唯一的元素集合。它基于红黑树数据结构实现,其中的元素按照一定的顺序进行排序。
以下是关于set的一些重要性质和用法解释:
- 唯一性set中的元素是唯一的,不允许重复。如果尝试插入已经存在的元素,插入操作将被忽略。
- 排序:set会自动根据元素的值进行排序,默认情况下,元素按照升序排列。也可以通过提供自定义的比较函数来定义元素排序规则。
- 插入和删除:可以使用insert()函数向set中插入元素,使用erase()函数删除指定的元素或范围内的元素。
- 查找:可以使用find()函数来查找指定的元素,它返回指向该元素的迭代器。如果元素不存在,返回set的末尾迭代器end()。
- 迭代器:可以使用迭代器遍历set中的元素,可以使用前向迭代器或逆向迭代器。
set适用于需要存储一组唯一且有序的元素的情况,比如需要对元素进行自动去重和排序的问题。在需要快速查找元素或按照一定顺序遍历元素的场景中,set是一个非常有用的容器。
一.使用前的准备工作:
#include<set> //包含 <list> 头文件,以便在代码中使用 list 容器的功能。
using namespace std;
//命名空间声明,使得代码中的标识符不需要加上 std:: 前缀来使用 std 命名空间中的内容,包括 //std::list在内。
set<int> myset;
//定义了一个名为 myset 的变量,这行代码创建了一个空的set 对象,可以在后续的代码中添加、删除和访问元素。
myset = {1, 2, 3, 4, 5}; //为链表添加元素
二.常用set类的成员函数:
1 | myset.insert(element) | 向set 中插入元素element。如果插入的元素已经存在,则插入操作会被忽略。 |
2 | myset.erase(要删除的元素) | 删除指定位置的元素。 |
3 | myset.erase(iterator) | 删除迭代器指向的元素。 |
4 | myset.erase(start,end) | 删除集合中将范围[start, end) 内的元素。 |
4 | myset.find() | 查找指定的元素,返回指向该元素的迭代器。如果元素不存在,则返回set 的末尾迭代器end() 。 |
5 | myset.size() | 返回集合的元素个数 |
6 | myset.empty() | 判断set 是否为空。 |
三.代码示例:
1.insert(element):
// 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
myset.insert(100);
printf("集合myset的元素为:\n");
for (int i = 0; i < myset.size(); i++)
{
auto it = next(myset.begin(), i);
printf("%d ", *it);
}
//输出:
集合myset的元素为:
1 2 3 4 5 100
2.erase(index):
// 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
myset.erase(0);
printf("删除第一个元素后,集合myset的元素为:\n");
for (int i = 0; i < myset.size(); i++)
{
auto it = next(myset.begin(), i);
printf("%d ", *it);
}
3.erase(iterator):
// 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
auto it = myset.find(4); // 指向元素1的迭代器
myset.erase(it);
printf("删除元素4后,集合myset的元素为:\n");
for (int i = 0; i < myset.size(); i++)
{
auto it = next(myset.begin(), i);
printf("%d ", *it);
}
//输出:
删除元素4后,集合myset的元素为:
1 2 3 5
4.myset.erase(start,end):
// 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
auto start = myset.find(2); // 指向元素2的迭代器
auto end = myset.find(4); // 指向元素4的迭代器
myset.erase(start, end); 删除[start,end)范围内的元素
printf("删除元素后,集合myset的元素为:\n");
for (int i = 0; i < myset.size(); i++)
{
auto it = next(myset.begin(), i);
printf("%d ", *it);
}
//输出:
删除元素后,集合myset的元素为:
1 4 5
5.size():
/ 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
myset.size();
printf("集合myset元素个数为:%d\n", len);
//输出:
集合myset元素个数为:5
6.empty():
// 定义并初始化集合
set<int> myset = {1, 2, 3, 4, 5};
int result = myset.empty();
if (result)
{
printf("集合为空\n");
}
else
{
printf("集合为空\n");
}
//输出:
集合为空