一、Set容器定义
set 是一个有序关联容器,其中的元素按照升序排列,且不允许重复元素。 set 中的元素是唯一的,即任意两个元素不能相等。
1、set 可以用来对元素进行排序,因为它会自动对元素进行有序排列。
2、set 可以用来去重,当我们需要对一个容器中的元素进行去重操作时,可以使用 set 来实现。
3、set 可以用来判断一个元素是否存在于容器中。
二、Set容器操作
1)创建Set容器
std::set<int> mySet; // 创建一个空的set
std::set<int> mySet2 = {1, 2, 3}; // 创建一个具有初始值的set
std::set<int> mySet3(mySet2); // 创建一个与另一个set相同的set
扩展:如果Set初始化元素需要从Vector数组直接赋值,可以使用迭代器,例如:
set<int> mySet(vec.begin(),vec.end());
2)添加元素
mySet.insert(5); // 向set中插入元素
std::set<int> anotherSet = {1, 2, 3}; // 向set中插入一段迭代器范围内的元素
mySet.insert(anotherSet.begin(), anotherSet.end());//将another(set容器)中的元素,赋值到新的set容器中
注:添加元素一般采用插入的方法,另外插入不需要指定位置,set容器会根据比较规则,自动进行排序。
3)访问元素
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << *it << " "; // 遍历set中的元素
}
注:set不支持通过索引访问元素,可以使用迭代器进行遍历
4)删除元素
mySet.erase(5); // 删除set中的元素
auto it = mySet.find(10); // 删除set中指定迭代器指向的元素
if (it != mySet.end()) {
mySet.erase(it);
}
mySet.erase(mySet.begin(), mySet.end()); // 删除set中指定范围的元素
mySet.clear(); // 清空set中的所有元素
5)获取容器的大小
mySet.size() // 返回set中元素的个数
mySet.empty() // 判断set是否为空
三、案例分析
要求用户输入一组整数,然后将这些整数存储在一个set容器中。最后,输出这个set容器中所有元素的个数以及所有元素的值。
代码示例:
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> mySet;
int arr[5] = {0};
cout<<"请输入您要存储的整数:";
for(int i = 0;i < 5;i++)
{
cin>>arr[i];
mySet.insert(arr[i]);
}
cout<<"Set容器中所有元素的个数:"<<mySet.size()<<endl;
cout<<"Set容器中的所有元素的值:";
for(auto it = mySet.begin();it != mySet.end();it++)
{
if(it != --mySet.end())
{
cout<<*it<<",";
}
else
{
cout<<*it;
}
}
cout<<endl;
return 0;
}
运算结果:
请输入您要存储的整数:1 2 3 4 5
Set容器中所有元素的个数:5
Set容器中的所有元素的值:1,2,3,4,5
四、集合set原理
注:存储数据时,自动排序(默认升序排序)后存储,值不能重复(自动去重)
template< class Key, class Compare = std::less<Key>,class Allocator = std::allocator<Key> > class set;
Key是元素类型, Compare是比较类型(用来比较存储的元素数据),默认使用标准库的小于比较类模板less传递元素类型Key所特例化的类型,即内部针对元素进行小于比较后存储 所以元素类型应提供小于比较的能力(自定义类型需重载小于比较运算符),也可以手动传递比较类型,处理元素类型数据的比较 Allocator是分配类型,使用默认提供的版本即可
五、总结
set 是一种实用的关联容器,特别适用于需要对元素进行排序和去重的场景。但在需要随机访问、大量插入或删除操作的情况下,可能不是最优选择。