set

头文件

#include<set>
using namespace std;

定义

set <int,greater<int> > s	//从s.begin()到s.end()的遍历结果为从大到小
set <int,less<int> > s	        //从s.begin()到s.end()的遍历结果为从小到大
set <st1> s                     //用结构体st1定义set,需要重载小于号
set <st1,cmp> s                 //用自定义的比较结构体cmp定义set

常用函数

s.insert(x) 	        //插入一个数x,若s是set则不会发生任何事,若s是multiset则计数+1
erase(iterator)	        //删除定位器iterator指向的元素(只删除指向的那一个)
erase(key_value)        //删除所有值为key_value的元素

s.begin() 		//返回第一个元素的迭代器
s.rbegin()		//返回最后一个元素的反向迭代器
s.end() 		//返回最后一个元素之后的空迭代器
s.find(x)		//返回一个指向x的迭代器,如果找不到则返回s.end()
s.lower_bound(x)	//返回按照排序规则在x之后的第一个元素的迭代器(可以等于x)
s.upper_bound(x)	//返回按照排序规则在x之后的第一个元素的迭代器(不能等于x)

s.size() 		//返回set中元素的个数
s.clear()		//清空set  复杂度O(N)
s.empty()		//判断set是否为空
s.count(x)		//返回set中x出现的个数

遍历方法

  • 一般元素
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
    printf("%d\n",*it);
}
  • 结构体元素
set<st1>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
    printf("%d %d\n",it->x,it->y);
}

自定义排序方法

以下为以x为第一关键字,y为第二关键字排序举例。

  • 重载运算符:需要重载小于号
struct st1{
    int x;
    int y;
};
bool operator < (st1 a, st1 b)
{
    if(a.x==b.x)return a.y<b.y;
    return a.x<b.x;
}
multiset <st1> s;
  • 自定义比较结构体:需要重载双括号()
struct st1{
    int x;
    int y;
};
struct cmp{
    bool operator () (st1 a,st1 b)
    {
	if(a.x==b.x)return a.y<b.y;
	return a.x<b.x;
    }
};
multiset <st1,cmp> s;

需要注意的是,与sort的比较函数相同,当两元素相同时必须返回false。
multiset的用法与set基本一致,引用头文件相同。

posted @ 2022-03-10 22:45  wild_chicken  阅读(83)  评论(0)    收藏  举报