目录
一、set基本概念
二、set构造和赋值
三、set大小和交换
四、set插入和删除
五、set查找和统计
六、set和multiset区别
七、pair对组创建
一、set基本概念
所有元素都会在插入时自动被排序
本质:set / multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:
- set不允许容器中有重复的元素
- multiset允许容器中有重复的元素
二、set构造和赋值
构造:
- set<T>st; //默认构造函数
- set(const set &st); //拷贝构造函数
赋值:
- set& operator=(const set &st); //重载等号操作符
代码示例
#include<iostream>
using namespace std;
#include<set>
void printS(set<int>s){
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test(){
set<int>s;
s.insert(3);
s.insert(2);
s.insert(5);
s.insert(1);
s.insert(4);
printS(s); //1 2 3 4 5
s.insert(4);
printS(s); //1 2 3 4 5 插入重复的数不会报错,但不会打印出来
set<int>s1(s);
printS(s1);//1 2 3 4 5
set<int>s2;
s2 = s1;
printS(s2);//1 2 3 4 5
}
int main(){
test();
return 0;
}
三、set大小和交换
函数原型:
- size(); //返回容器中元素的数目
- empty(); //判断容器是否为空
- swap(st); //交换两个集合容器
代码示例
#include<iostream>
using namespace std;
#include<set>
void printS(set<int>s){
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test(){
set<int>s;
s.insert(3);
s.insert(2);
s.insert(5);
s.insert(1);
s.insert(4);
if(s.empty()){
cout<<"s为空"<<endl;
}else{
cout<<"s不为空"<<endl;
cout<<"s中元素个数为:"<<s.size()<<endl;
}
set<int>s1;
s1.insert(6);
s1.insert(8);
s1.insert(7);
s1.insert(10);
s1.insert(9);
cout<<"交换前:"<<endl;
printS(s);
printS(s1);
cout<<"交换后:"<<endl;
s.swap(s1);
printS(s);
printS(s1);
}
int main(){
test();
return 0;
}
四、set插入和删除
函数原型:
- insert(elem); //在容器中插入元素
- clear(); //清除所有元素
- erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器
- erase(beg , end); //删除区间[beg , end)的所有元素,返回下一个元素的迭代器
- erase(elem); //删除容器中的值为elem的元素
代码示例
#include<iostream>
using namespace std;
#include<set>
void printS(set<int>s){
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test(){
set<int>s;
s.insert(3);
s.insert(2);
s.insert(5);
s.insert(1);
s.insert(4);
printS(s);//1 2 3 4 5
s.erase(s.begin());
printS(s);//2 3 4 5
s.erase(4);
printS(s);//2 3 5
//清空
// s.clear();
s.erase(s.begin() , s.end());
printS(s);
}
int main(){
test();
return 0;
}
五、set查找和统计
函数原型:
- find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end()
- count(key); //统计key的元素的个数
代码示例
#include<iostream>
using namespace std;
#include<set>
void printS(set<int>s){
for(set<int>::iterator it = s.begin();it!=s.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
void test(){
set<int>s;
s.insert(3);
s.insert(2);
s.insert(4);
s.insert(1);
s.insert(4);
printS(s);//1 2 3 4 5
set<int>::iterator it = s.find(3);
if(it != s.end()){
cout<<"找到了"<<*it<<endl;
}else{
cout<<"没找到"<<endl;
}
int num = s.count(4);//只会出现1和0
cout<<"num="<<num<<endl;
}
int main(){
test();
return 0;
}
六、set和multiset区别
区别:
- set不可以插入重复数据,而multiset可以
- set插入数据的同时回返回插入的结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
代码示例
#include<iostream>
using namespace std;
#include<set>
void test(){
set<int>s;
pair<set<int>::iterator , bool> S = s.insert(1);
if(S.second){
cout<<"第一次插入成功"<<endl;
}else{
cout<<"第一次插入失败"<<endl;
}
S = s.insert(1);
if(S.second){
cout<<"第二次插入成功"<<endl;
}else{
cout<<"第二次插入失败"<<endl;
}
multiset<int>m;
m.insert(2);
m.insert(2);
for(multiset<int>::iterator it = m.begin();it!=m.end();it++){
cout<< *it <<" ";
}
cout<<endl;
}
int main(){
test();
return 0;
}
七、pair对组创建
两种创建方式:
- pair<type , type> p ( value1 , value2);
- pair<type , type> p = make_pair(vlaue1 , value2);
代码示例
#include<iostream>
using namespace std;
void test(){
pair<string , int> p ("张三", 18);
cout<<"姓名:"<<p.first<<" "<<"年龄:"<<p.second<<endl;
pair<string , int> p1 = make_pair("李四", 20);
cout<<"姓名:"<<p1.first<<" "<<"年龄:"<<p1.second<<endl;
}
int main(){
test();
return 0;
}