- set容器
4.1关联式容器
4.2插入数据自动排序 按照key
4.3 insert插入值
4.4 erase参数可以传值 或者 迭代器
4.5 find()返回值 迭代器 找不到返回的 endl()
4.6 count计数 对于set而言 结果 就是 0 或者 1
4.7. lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
4.8. upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
4.9. equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
4.10 对组pair
4.10.1 第一个值 first
4.10.2 第二个值 second
4.10.3 默认括号
4.10.4 make_pair()
4.11 set插入返回值 对组 <迭代器 ,是否成功标识>
4.12 指定set的排序规则,利用仿函数
4.13 set插入自定义数据类型
#include <iostream>
using namespace std;
#include <set>
#include <string>
// set multiset 头文件 都是 #include <set>
/*
3.7.2.1 set构造函数
set<T>st;//set默认构造函数
mulitset<T>mst;//mulitset默认构造函数
set(const set&st);//拷贝构造函数
3.7.2.2 set赋值操作
set operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
3.7.2.3 set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
3.7.2.4 set插入和删除操作
insert(elem);//在容器中插入元素
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end);//删除区间 的所有元素,返回下一个元素的迭代器
erase(elem);//删除容器中值为elem的元素
*/
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;
//关联式容器 key进行排序 ,从小到大
s1.insert(5);
s1.insert(1);
s1.insert(9);
s1.insert(3);
s1.insert(7);
printSet(s1);
if(s1.empty() ) {
cout<<"空"<<endl;
} else {
cout<<"size="<<s1.size() <<endl;
}
s1.erase(s1.begin() );
printSet(s1);
s1.erase(3);
printSet(s1);
}
/*set 查找操作
find(key);//查找键key是否存在,若存在,返回改键的元素的迭代器;若不存在 返回set.end()
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
*/
void test02() {
set<int> s1;
s1.insert(5);
s1.insert(1);
//s1.insert(1);
s1.insert(9);
s1.insert(3);
s1.insert(7);
//对于set 没有value key就是value
set<int>::iterator pos= s1.find(2);
//判断是否找到
if(pos!=s1.end() ) {
cout<<"找到了,值为:"<<*pos <<endl;
} else {
cout<<"未找到"<<endl;
}
// count (key)结果0或者1
int num=s1.count(1);
cout<<"1的个数为:"<<num<<endl;
//lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
set<int>::iterator it=s1.lower_bound(3);//10就是未找到
if(it!=s1.end() ) {
cout<<"找到了lower_bound(3)的值为:"<<*it<<endl;
} else {
cout<<"未找到"<<endl;
}
//upper_bound(keyElem);//返回第一的key>keyElem元素的迭代器
set<int>::iterator it2=s1.upper_bound(3);
if(it2!=s1.end() ) {
cout<<"找到了upper_bound(3)的值为:"<<*it2<<endl;
} else {
cout<<"未找到"<<endl;
}
// equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
//上下限 就是 lower_bound upper_bound
pair<set<int>::iterator,set<int>::iterator> ret = s1.equal_range(3);
//获取 第一个值
if(ret.first!=s1.end()) {
cout<<"找到equal_range中lower_bound的值:"<<*(ret.first)<<endl;
} else {
cout<<"未找到"<<endl;
}
//获取第二个值
if(ret.second!=s1.end()) {
cout<<"找到equal_range中upper_bound的值:"<<*(ret.second)<<endl;
} else {
cout<<"未找到"<<endl;
}
}
//set容器 不允许插入重复的键值
void test03()
{
set <int>s1;
pair<set<int>::iterator,bool>ret =s1.insert(10);
if(ret.second ){
cout<<"插入成功"<<endl;
}
else
{
cout<<"插入失败"<<endl;
}
ret =s1.insert(10);
if(ret.second ){
cout<<"第二次插入成功"<<endl;
}
else
{
cout<<"第二次插入失败"<<endl;
printSet(s1);
}
}
//指定set排序规则 从大到小
//仿函数 int属于基础数据类型
class myCompare{
public:
//重载()
bool operator ()(int v1,int v2)
{
return v1>v2;
}
};
//set容器排序
void test04()
{
set<int,myCompare>s1;
s1.insert(5);
s1.insert(1);
s1.insert(9);
s1.insert(3);
s1.insert(7);
// printSet(s1);
//从大到小排序
//在插入之前就指定排序规则
for(set<int,myCompare>::iterator it=s1.begin() ;it!=s1.end() ;it++)
{
cout<<*it<<" ";
}
cout<<endl;
myCompare my;
my(1,2);
}
//自定义数据类型
class Person{
public:
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
class myComparePerson{
public:
bool operator()(const Person &p1,const Person &p2)
{
if(p1.m_Age>p2.m_Age)
//降序
{
return true;
}
return false;
}
};
void test05()
{
set<Person,myComparePerson>s1;
Person p1("大娃",100);
Person p2("二娃",90);
Person p3("六娃",10);
Person p4("爷爷",1000);
s1.insert(p1);
s1.insert(p2);
s1.insert(p3);
s1.insert(p4);
//插入自定义数据类型,上来就制定好排序规则
//显示
for(set<Person,myComparePerson>::iterator it=s1.begin() ;it!=s1.end() ;it++)
{
cout<<"name:"<<(*it).m_Name <<"age:"<<it->m_Age<<endl;
}
}
int main()
{
//test01();
// test02();
//test03();
// test04();
test05();
}