set基本概念:
简介:所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构式用二叉树实现的
set和multiset区别:
-
set不允许容器中有重复的元素
-
multiset允许容器中有重复元素
set构造和赋值:
构造:
-
set<T> st:默认构造
-
set(const set &st):拷贝构造函数
赋值:
-
set& operator=(const set &st):重载等号
#include<bits/stdc++.h>
using namespace std;
void printset(set<int>s){
for(set<int>::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
void test01(){
set<int>s1;
//插入数据只有insert方式
s1.insert(10);
s1.insert(40);
s1.insert(30);
s1.insert(20);
s1.insert(50);
printset(s1);
//set容器所有元素在插入的时候会自动排序
//set容器不允许插入重复的值
//拷贝构造
set<int>s2(s1);
printset(s2);
//赋值构造
set<int>s3;
s3=s2;
printset(s3);
}
int main(){
test01();
return 0;
}
set的大小和交换
函数原型:
-
size():返回容器中元素的数目
-
empty():判断容器是否为空
-
swap(st):交换两个集合容器
#include<bits/stdc++.h>
using namespace std;
void printset(set<int>s){
for(set<int>::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
//大小
void test01(){
set<int>s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
//打印容器
printset(s1);
if(s1.empty()){
cout<<"s1容器为空:"<<endl;
}
else{
cout<<"s1容器不为空"<<endl;
}
cout<<"s1的大小为:"<<s1.size()<<endl;
}
//交换
void test02(){
set<int>s1;
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
set<int>s2;
s2.insert(100);
s2.insert(200);
s2.insert(300);
s2.insert(400);
s2.insert(500);
cout<<"交换前:"<<endl;
printset(s1);
printset(s2);
s1.swap(s2);
cout<<"交换后:"<<endl;
printset(s1);
printset(s2);
}
int main(){
test01();
test02();
return 0;
}
set插入和删除:
函数原型:
-
insert(elem):在容器中插入元素
-
clear():清除所有元素
-
erase(pos):删除pos迭代器所指的元素,返回下一个元素的迭代器
-
erase(beg,end):删除区间[beg,end)的所有元素,返回下一个元素的迭代器
-
erase(elem):删除容器中值为elem的元素
#include<bits/stdc++.h>
using namespace std;
void printset(set<int>s){
for(set<int>::iterator it=s.begin();it!=s.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
void test01(){
set<int>s1;
//插入
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
printset(s1);
//删除
s1.erase(s1.begin());
printset(s1);
//删除的重载版本
s1.erase(30);
printset(s1);
//清空操作
s1.erase(s1.begin(),s1.end());
printset(s1);
}
int main(){
test01();
return 0;
}
set查找和统计:
函数原型:
-
find(key):查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()
-
count(key):统计key的元素个数
#include<bits/stdc++.h>
using namespace std;
void test01(){
set<int>s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
//查找
set<int>::iterator pos=s1.find(30);
if (pos!=s1.end()){
cout<<"找到元素:"<<*pos<<endl;
}
else cout<<"未找到元素"<<endl;
}
//统计
void test02(){
set<int>s1;
//插入数据
s1.insert(10);
s1.insert(20);
s1.insert(30);
s1.insert(40);
s1.insert(50);
//统计30的个数
int num=s1.count(30);
cout<<num<<endl;
//对于set而言,统计的结果要么是0要么是1
}
int main(){
test01();
return 0;
}
set和multiset区别
区别:
-
set不可以插入重复数据,而multiset可以
-
set插入数据同时会返回插入结果,表示插入是否成功
-
multiset不会检测数据,因此可以插入重复数据
#include<bits/stdc++.h>
using namespace std;
//set容器和multiset容器的区别
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;
pair<set<int>::iterator,bool>ret=s.insert(10);
if(ret.second){
cout<<"第一次插入成功"<<endl;
}
else {
cout<<"第一次插入失败"<<endl;
}
ret=s.insert(10);
if(ret.second){
cout<<"第二次插入成功"<<endl;
}
else {
cout<<"第二次插入失败"<<endl;
}
multiset<int>ms;
//允许插入重复值
ms.insert(10);
ms.insert(10);
for(multiset<int>::iterator it=ms.begin();it!=ms.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
int main(){
test01();
return 0;
}
pair对组创建
两种创建方式:
-
pair<type,type>p(value,value2)
-
pair<type,type>p =make_pair(value,value2)
#include<bits/stdc++.h>
using namespace std;
//创建对组pair
void test01(){
//第一种方式
pair<string,int>p("Tom",20);
cout<<"姓名:"<<p.first<<" 年龄:"<<p.second<<endl;
//第二种方式创建对组
pair<string,int>p2=make_pair("Jerry",30);
cout<<"姓名:"<<p2.first<<" 年龄:"<<p2.second<<endl;
}
int main(){
test01();
return 0;
}
set容器的排序:
1.内置类型指定排序:
#include<bits/stdc++.h>
using namespace std;
//set容器存放内置数据排序
class cmp{
public:
bool operator()(int v1,int v2){
return v1>v2;
}
};
void test01(){
set<int>s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(50);
s1.insert(40);
for(set<int>::iterator it=s1.begin();it!=s1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
//指定排序从大到小
set<int,cmp>s2;
s2.insert(10);
s2.insert(30);
s2.insert(20);
s2.insert(50);
s2.insert(40);
for(set<int,cmp>::iterator it=s2.begin();it!=s2.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
int main(){
test01();
return 0;
}
2. 自定义数据类型指定排序
#include<bits/stdc++.h>
using namespace std;
//set排序存放自定义数据类型
class Person{
public:
string m_Name;
int m_Age;
Person(string name,int age){
this->m_Name=name;
this->m_Age=age;
}
};
class cmp{
public:
bool operator()(const Person&p1,const Person&p2){
return p1.m_Age>p2.m_Age;
}
};
void test01(){
//自定义数据类新,都会指定规则
set<Person,cmp>s;
Person p1("刘备",24);
Person p2("张飞",25);
Person p3("关羽",28);
Person p4("赵云",21);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
for(set<Person,cmp>::iterator it=s.begin();it!=s.end();it++){
cout<<"姓名:"<<it->m_Name<<" 年龄:"<<it->m_Age<<endl;
}
cout<<endl;
}
int main(){
test01();
return 0;
}