STL容器之set/multiset
2022-10-11 本文已影响0人
二进制人类
构造函数
set<T> st;//set 默认构造函数:
mulitset<T> mst; //multiset 默认构造函数:
set(const set &st);//拷贝构造函数
赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
插入 删除
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为 elem 的元素。
实例
#include <iostream>
#include <set>
using namespace std;
void printSetInt(set<int> &s)
{
set<int>::const_iterator it=s.begin();
for(;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
set<int> s1;
s1.insert(30);
s1.insert(20);
s1.insert(40);
s1.insert(50);
s1.insert(10);
printSetInt(s1);//10 20 30 40 50
return 0;
}
查找
find(key);//查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 set.end();
count(key);//查找键 key 的元素个
实例
#include <iostream>
#include <set>
using namespace std;
void printSetInt(set<int> &s)
{
set<int>::const_iterator it=s.begin();
for(;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
set<int> s1;
s1.insert(30);
s1.insert(20);
s1.insert(40);
s1.insert(50);
s1.insert(10);
printSetInt(s1);//10 20 30 40 50
set<int>::const_iterator ret;
ret = s1.find(40);
if(ret != s1.end())
{
cout<<"找到的值为:"<<*ret<<endl;//40
}
//count(key);统计key值的个数 结果必定是0或1 (key值是不重复的)
cout<<s1.count(40)<<" "<<s1.count(400)<<endl;//1 0
return 0;
}
更改set容器排序规则
#include <iostream>
#include <set>
using namespace std;
//更改set容器的规则 只能使用仿函数
class MyGreater
{
public:
bool operator()(int v1, int v2)
{
return v1>v2;
}
};
void printSetInt(set<int,MyGreater> &s)
{
set<int,MyGreater>::const_iterator it=s.begin();
for(;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
set<int,MyGreater> s1;
s1.insert(30);
s1.insert(20);
s1.insert(40);
s1.insert(50);
s1.insert(10);
printSetInt(s1);//50 40 30 20 10
return 0;
}
自定义数据
#include <iostream>
#include <set>
using namespace std;
class Hero;
class MyGreaterHero;
class Hero
{
friend class MyGreaterHero;
friend void printSetHero(set<Hero, MyGreaterHero> &s);
private:
string name;
int def;
int atk;
public:
Hero(){}
Hero(string name, int def, int atk):name(name),def(def),atk(atk){}
#if 0
//重载运算符<
bool operator<(const Hero ob)const
{
return this->def < ob.def;
}
#endif
};
class MyGreaterHero
{
public:
bool operator()(Hero ob1, Hero ob2)
{
return ob1.def<ob2.def;
}
};
void printSetHero(set<Hero, MyGreaterHero> &s)
{
set<Hero, MyGreaterHero>::const_iterator it=s.begin();
for(;it!=s.end();it++)
{
cout<<(*it).name<<" "<<(*it).def<<" "<<(*it).atk<<endl;
}
}
int main()
{
set<Hero, MyGreaterHero> s;
s.insert(Hero("小法", 79, 80));
s.insert(Hero("盲僧", 60, 90));
s.insert(Hero("剑圣", 59, 70));
s.insert(Hero("提莫", 49, 90));
s.insert(Hero("鳄鱼", 89, 70));
printSetHero(s);
/*
提莫 49 90
剑圣 59 70
盲僧 60 90
小法 79 80
鳄鱼 89 70
*/
return 0;
}
寻找上下限
lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。
upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。
equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
实例
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s1;
s1.insert(30);
s1.insert(20);
s1.insert(40);
s1.insert(50);
s1.insert(10);
//10 20 30 40 50
//寻找30的下限
set<int>::const_iterator ret;
ret = s1.lower_bound(30);
if(ret != s1.end())
{
cout<<"lower_bound(30)的下限为:"<<*ret<<endl;//30
}
ret = s1.upper_bound(30);
if(ret != s1.end())
{
cout<<"upper_bound(30)的上限为:"<<*ret<<endl;//40
}
//对组:pair<第一个值的类型, 第二个值的类型>
//first访问第一个值 second访问第二个值
pair<set<int>::const_iterator , set<int>::const_iterator> pr;
pr = s1.equal_range(30);
if(pr.first != s1.end())
{
cout<<"lower_bound(30)的下限为:"<<*(pr.first)<<endl;//30
}
if(pr.second != s1.end())
{
cout<<"upper_bound(30)的上限为:"<<*(pr.second)<<endl;//40
}
return 0;
}
multiset容器
void printSetInt(multiset<int> &s)
{
multiset<int>::const_iterator it=s.begin();
for(;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
void test(){
multiset<int> s;
s.insert(30);
s.insert(20);
s.insert(40);
s.insert(20);
s.insert(20);
printSetInt(s); //20 20 20 30 40
}