一、set的介绍
1.set是集合的意思,集合中不会出现重复的元素。
2.set是基于红黑树实现的,因此它能够高效地进行插入、删除和查找操作。
3.set中的元素默认是按照值的顺序(升序或降序)排列的。
二、set的定义
set<类型>容器名 , 使用set时需带上头文件#include<set>
example:
存储int型的值set<int>s;
存储double型的值set<double>s;
存储char型的值set<char>s;
存储string型的值set<string>s;
存储结构体型的值set<结构体名>s;
三、set的一些基本成员函数
- insert() //插入元素
- size() //返回容器的大小
- erase() //删除集合中的某个元素
- clear() //清空集合
- empty() //判断是否为空
- begin() //返回第一个元素的迭代器
- end() //返回最后一个元素的迭代器
- rbegin() //反向迭代器
- rend() //反向迭代器
- find() //查找某个指定元素
- lower_bound() //返回一个迭代器,指向第一个键值大于x的元素
- upper_bound() //返回一个迭代器,指向第一个键值大于x的元素
- get_allocator() //返回集合的分配器
- swap() //交换两个集合的变量
- max_size() //返回集合能容纳元素的最大极限值
1.插入,遍历
//set定义
set<int>s;
//插入元素
s.insert(1);
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(5);
s.insert(2);
s.insert(4);
//set的遍历
set<int> :: iterator it; //使用迭代器
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
运行结果
set是基于红黑树实现的,因此它的元素总是有序的。
set中的元素是唯一的,如果你尝试插入一个已经存在于集合中的元素,它不会被添加,而是保持原有的元素不变。
2.容器的大小,删除元素,清空,判空
//删除某个元素
s.erase(2); //删除元素3
cout << "删除元素2后的s:" << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << endl;
//判空
cout << "判空" << endl;
cout << "s.empty = " << s.empty() << endl;
cout << endl;
//清空s
s.clear();
cout << "清空后:" << endl;
cout << "size = " << s.size() << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//判空
cout << "判空" << endl;
cout << "s.empty = " << s.empty() << endl;
运行结果
判空,如果容器为空,则返回1;如果容器不为空,则返回0。
3.查找
//查找某个元素
for(int i = 0; i < 5; i++)
{
s.insert(i);
}
cout << "现有的元素:" << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "查找元素2:" << endl;
if(s.find(2) != s.end())
{
cout << "找到了" << endl;
}
else
{
cout << "没找到" << endl;
}
cout << "查找元素5:" << endl;
if(s.find(5) != s.end())
{
cout << "找到了" << endl;
}
else
{
cout << "没找到" << endl;
}
cout << endl;
cout << "返回第一个不小于3的数:";
cout << *s.lower_bound(3) << endl;
cout << "放回第一个大于3的数:";
cout << *s.upper_bound(3) << endl;
cout << endl;
运行结果
find
:返回一个迭代器,指向找到的第一个匹配元素。如果找不到匹配的元素,它通常返回一个指向容器末尾(end()
)的迭代器。在 std::set
中,由于元素唯一,找到的迭代器指向该元素,否则指向 end()
。
4.反向迭代器
//反向迭代器,逆序输出
set<int>::reverse_iterator t;
for(t = s.rbegin(); t != s.rend(); t++)
{
cout << *t << " ";
}
cout << endl;
运行结果
所有代码
#include<iostream>
#include<set>
using namespace std;
int main()
{
//set定义
set<int>s;
//插入元素
s.insert(1);
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(5);
s.insert(2);
s.insert(4);
//set的遍历
cout << "遍历s:" << endl;
set<int> :: iterator it; //使用迭代器
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << endl;
//容器的大小
cout << "size = " << s.size() << endl;
cout << endl;
//删除某个元素
s.erase(2); //删除元素3
cout << "删除元素2后的s:" << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << endl;
//判空
cout << "判空" << endl;
cout << "s.empty = " << s.empty() << endl;
cout << endl;
//清空s
s.clear();
cout << "清空后:" << endl;
cout << "size = " << s.size() << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//判空
cout << "判空" << endl;
cout << "s.empty = " << s.empty() << endl;
cout << endl;
//查找某个元素
for(int i = 0; i < 5; i++)
{
s.insert(i);
}
cout << "现有的元素:" << endl;
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "查找元素2:" << endl;
if(s.find(2) != s.end())
{
cout << "找到了" << endl;
}
else
{
cout << "没找到" << endl;
}
cout << "查找元素5:" << endl;
if(s.find(5) != s.end())
{
cout << "找到了" << endl;
}
else
{
cout << "没找到" << endl;
}
cout << endl;
cout << "返回第一个不小于3的数:";
cout << *s.lower_bound(3) << endl;
cout << "放回第一个大于3的数:";
cout << *s.upper_bound(3) << endl;
cout << endl;
//反向迭代器,逆序输出
set<int>::reverse_iterator t;
for(t = s.rbegin(); t != s.rend(); t++)
{
cout << *t << " ";
}
cout << endl;
return 0;
}