STL——set/multiset容器

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;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值