# include<iostream>
#include<set>
using namespace std;
/*
- set 容器
- 所有元素在插入时都会自动排序
- 本质:
- set/multiset 属于关联式容器,底层结构是用二叉树实现的
set和multiset区别:
set不允许有重复的元素,在插入时会返回插入结果,表示插入是否成功
- multiset 可以有重复的元素,不会检测数据,因此可以重复
set构造和赋值
- set st; 默认构造函数
- set(const set& st); 拷贝构造函数
- 赋值:
- set& operator=(const set& st); 重载=赋值
大小和交换
*size() 返回容器中的元素的数目
empty() 判断容器是否为空
swap(st)交换两个集合的容器
插入删除操作
insert(elem) 在容器中插入elem
clear() 清除所有元素
erase(pos) 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end)删除区间所有元素,返回下一个元素的迭代器
erase(elem) 删除容器中值为elem的元素
查找和统计
find(key) 查找key是否存在。存在返回该元素的迭代器,不存在返回set.end()
cout(key) 统计key元素的个数
pair对组创建
两种创建方式:
pair p(val1,val2);
pair p=make_pair(val1,val2);
set排序:内置类型排序
默认规则 从小到大
利用仿函数,改变排序规则
仿函数yong类调用函数
自定义类型排序:
对于自定义类型数据,一定要制定排序规则
*/
void printset(set<int>& s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int>s;
s.insert(20);
s.insert(20);//即使插入重复的元素,也会按一个元素算
s.insert(10);
s.insert(30);
s.insert(30);
s.insert(30);
printset(s);
set<int>s1;
s1 = s;//赋值构造
set<int>s3(s);
printset(s3);
s3.erase(20);
s3.erase(s3.begin());
printset(s3);
set<int>::iterator it = s.find(30);//find()返回迭代器
cout << "zhaochaowei:" << *it << endl;
int num = s.count(30);
//不管有几个30,num要么为1,要么为0
cout << "num=" << num << endl;
}
void test02()
{
//对组创建一:
pair<string, int>p("xiaojiejie", 20);
cout << p.first << endl << p.second << endl;
//对组创建二:
pair<string, int>p1 = make_pair("jiejeixue", 21);
cout << p1.first << endl << p1.second << endl;
}
class comp
{
public:
bool operator()(int val, int vall)const
//必须要const加在仿函数后面
{
return val > vall;
}
};
void test03()
{
set<int>s;//默认排序 从小到大
s.insert(10);
s.insert(30);
s.insert(20);
s.insert(40);
printset(s);
set<int, comp>s2;
s2.insert(10);
s2.insert(30);
s2.insert(20);
s2.insert(40);
for (set<int, comp>::iterator itt = s2.begin(); itt != s2.end(); itt++)
{
cout << *itt << " ";
}
cout << endl;
}
class person
{
public:
person(string name, int age)
{
this->name = name;
this->age = age;
}
int age;
string name;
};
class com
{
public:
bool operator()(const person& p1, const person& p2)const
{
return p1.age > p2.age;
}
};
void test04()
{
//自定义类型,比较仿函数
set<person,com>s;
person p1("xiaojiejie", 10);
person p2("xiaojie", 60);
person p3("jiejie", 20);
s.insert(p1);
s.insert(p2);
s.insert(p3);
for (set<person, com>::iterator it = s.begin();it != s.end(); it++ )
{
cout << it->age << it->name << endl;
}
}
int main()
{
//test01();
// test02();
//test03();
test04();
system("pause");
return 0;
}