目录
一、set容器基本概念
二、set构造和赋值
三、set 大小和交换
四、set 插入和删除
五、set 查找和统计
六、set 和 multiset 的区别
七、set 容器排序
八、set 容器自定义类型数据排序
1. 功能:所有元素都会在插入时自动排好序
2. 本质:set/multiset 属于关联式容器,底层结构是用二叉树实现的
3. set和multiset的区别
set 不允许容器中有重复的元素
multiset 允许容器中有重复的元素
构造:
- set
st; // 默认构造函数 - set(const set & st); // 拷贝构造函数
赋值:
- set & opeartor=(const set & st); // 重载等号操作符
#include
using namespace std;
#include
// 遍历
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s1;
// 插入数据 只有insert的方法
for(int i=0;i<10;i++)
{
s1.insert(i);
}
for(int i=0;i<10;i++)
{
s1.insert(i);
}
// 插入多个数据只存储一个
// set 容器在所有元素插入的时候会自动排序
// set 容器不允许插入重复的值
print_set(s1);
// 拷贝构造
set s2(s1);
print_set(s2);
// 赋值
set s3;
s3 = s1;
print_set(s3);
return 0;
}
set容器不允许重新指定大小,因为会用相同的容器填充,而set容器不允许有相同的数据
- size(); // 返回容器中元素的个数
- empty(); // 判断容器是否为空
- swap(); // 交换两个集合容器
#include
using namespace std;
#include
// 遍历
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s1;
// 插入数据 只有insert的方法
for(int i=0;i<10;i++)
{
s1.insert(i);
}
print_set(s1);
if(s1.empty())
cout<<"s1为空"< s2;
s2.insert(100);
s2.insert(200);
s2.insert(300);
s2.insert(400);
cout<<"交换前:"<
- insert(elem); // 在容器中插入元素
- erase(pos); // 删除pos迭代器所指向的元素,返回下一个元素的迭代器
- erase(beg, end); // 删除(beg,end)区间内的所有元素,返回下一个元素的迭代器
- erase(elem); // 删除容器中值为elem的元素
- clear(); //清空容器中所有数据
#include
using namespace std;
#include
// 遍历
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s1;
// 插入数据 只有insert的方法
for(int i=0;i<10;i++)
{
s1.insert(i);
}
print_set(s1);
// 删除
cout<<"删除指定迭代器的数据\t";
s1.erase(s1.begin());
print_set(s1);
// 删除的重载版本
// 可以直接指定要删除的内容
cout<<"删除指定的数据\t";
s1.erase(5);
print_set(s1);
// 清空的操作
cout<<"删除区间内所有的元素\t";
s1.erase(s1.begin(),s1.end());
print_set(s1);
// clear 清空
s1.clear();
print_set(s1);
return 0;
}
- find(key); // 查找key是否存在,若存在返回该元素的迭代器,若不存在,返回set.end();
- count(key); // 统计key的元素个数
#include
using namespace std;
#include
// 遍历
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s1;
// 插入数据 只有insert的方法
for(int i=0;i<10;i++)
{
s1.insert(i);
}
print_set(s1);
set::iterator pos = s1.find(100); // 返回的是迭代器的位置,没有找到返回s.end();
if(pos!=s1.end())
cout<<"找到你要的数的位置:"<<*pos<
- set 不可以插入重复的数据,而 multiset 可以
- set 插入数据的同时会返回插入的结果,表示插入是否成功
- multiset 不会检测数据,因此可以插入重复数据
#include
using namespace std;
#include
// 遍历
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< &S)
{
for(multiset::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s1;
// 插入数据 只有insert的方法
for(int i=0;i<10;i++)
{
s1.insert(i);
}
print_set(s1);
// 利用对组,判断是否插入成功
pair::iterator,bool> ret = s1.insert(0); // 不能再插入0
if(ret.second)
cout<<"插入成功 "< s2;
s2.insert(20);
s2.insert(20);
s2.insert(20);
s2.insert(300);
s2.insert(400);
print_multiset(s2);
return 0;
}
利用仿函数,可以改变排序规则
#include
using namespace std;
#include
// 在类内写的仿函数
class my_compare
{
public:
bool operator()(int v1,int v2) // 重载的()
{
return v1>v2;
}
};
// 默认的遍历方式
void print_set(set &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< &S)
{
for(set::iterator it=S.begin();it!=S.end();it++)
{
cout<<*it<<" ";
}
cout< s;
s.insert(10);
s.insert(40);
s.insert(67);
s.insert(23);
s.insert(89);
print_set(s);
// 要在还没有插入数据的时候就设定排序规则
set s1;
s1.insert(10);
s1.insert(40);
s1.insert(67);
s1.insert(23);
s1.insert(89);
print_set(s1);
// 默认排序规则为从小打到大的升序
// 改变排序的规则为从大到小的降序
return 0;
}
#include
using namespace std;
#include
// 自定义数据
class person
{
public:
person(string name,int age)
{
this->name=name;
this->age=age;
}
string name;
int age;
};
// 仿函数
class my_compare
{
public:
bool operator()(const person &p1,const person &p2)
{
// 按照年龄的 降序排列
return p1.age>p2.age;
}
};
// set 容器排自定义数据序
int main()
{
// 创建person对象
person p1("TOM",20);
person p2("JERRY",30);
person p3("mike",23);
person p4("good",45);
set s1;
// 对于自定义的数据类型,要指定排序规则
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
for(set::iterator it=s1.begin();it!=s1.end();it++)
{
cout<<"姓名:"<name<<"\t年龄:"<age<