包含头文件<set>
一个存储数据的容器,这个容器有一些特性
set<int> setData = { 1,2,3,4,5,6 }; //创建一个集合
单集合
数据自带排序(默认从小到大)
数据的唯一性(没有重复:把数组里面的元素装到 set 集合中会自动去重)
随机插入的是 10 个元素,但是只有 6 个元素,由于随机出来的元素中有相同的,如果有相同的话就没有插入成功,保留原来的元素,对比数组和集合中的元素
数据类型、排序准则、分配器
#include <set>
#include <iostream>
#include <ctime>
using namespace std;
void testSet()
{
//设置随机函数种子
srand((unsigned int)time(nullptr));
set<int> setData; //默认方式 从小到大
set<int, less<int>> setData2; //和默认方式一样
set<int, greater<int>> setData3; //从大到小
int array[10] = { 0 };
//插入 10 个元素
for (int i = 0; i < 10; i++)
{
int temp = rand() % 10;
array[i] = temp;
//插入方式用 insert 方法
setData.insert(temp);
}
for (auto v : array)
{
cout << v << " ";
}
cout << endl;
//用迭代器去做遍历
for (set<int>::iterator iter = setData.begin(); iter != setData.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
}
int main()
{
testSet();
testUserData();
testmultiset();
return 0;
}
/* 输出 */
0 7 3 3 5 4 3 0 5 1
0 1 3 4 5 7
单集合存储自定义类型数据
关键点在于重载
里面肯定要做比较,需要自己写比较准则
从小到大的比较准则:less<int>,需要重载 <
相同的数据没有做插入,也没有采用覆盖的方式(如果存在相同的,就不做插入)
class MM
{
public:
MM(string name, int age) :name(name), age(age) {}
//比较 MM 类型的对象 按姓名的方式比较
bool operator<(const MM& object)const
{
return this->name < object.name;
}
//增加一个方法访问数据
void print()
{
cout << name << " " << age << endl;
}
protected:
string name;
int age;
};
void testUserData()
{
set<MM> mmData;
//插入数据
mmData.insert(MM("name3", 19));
mmData.insert(MM("name2", 28));
mmData.insert(MM("name3", 188));
//遍历
for (auto v : mmData)
{
//每一个v都是一个MM对象
v.print();
}
//存储其他类型
set<char> cData;
set<string> strData;
}
/* 输出 */
name2 28
name3 19
多重集合
只具有排序功能,不具有去重功能
void testmultiset()
{
multiset<int> mulData;
for (int i = 0; i < 10; i++)
{
mulData.insert(rand() % 10);
//生成随机的字符
//rand()%26+'A';
//rand()%26+'a';
}
for (auto v : mulData)
{
cout << v << " ";
}
cout << endl;
}
/ * 输出 */
0 1 2 4 4 4 7 7 8 9