目录
一、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 5s.insert(4);printS(s); //1 2 3 4 5 插入重复的数不会报错,但不会打印出来set<int>s1(s);printS(s1);//1 2 3 4 5set<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 5s.erase(s.begin());printS(s);//2 3 4 5s.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 5set<int>::iterator it = s.find(3);if(it != s.end()){cout<<"找到了"<<*it<<endl;}else{cout<<"没找到"<<endl;}int num = s.count(4);//只会出现1和0cout<<"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;
}