STL之set与multiset(简单整理)

set简介:

set的含义是集合,它是一个有序的容器(默认是从小到大),里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。

set和multiset的区别是:

set插入的元素不能相同(因为它自动去重)每个元素只有一个,但是multiset可以相同(相同元素可以有多个)。

set的基本操作:

定义set容器类型的变量:

STL之set与multiset(简单整理)_第1张图片

set内元素的访问:

只能通过迭代器来访问。

set::iterator it;

注意: 

  • 只能通过枚举来访问,不支持 *(it+i)的方式。
  • 循环结束时只能写 it!=st.end() 不能写it
  • st.end()获得的是最后一个元素的后一个位置。
int main(){
	set st;
	st.insert(3);
	st.insert(4);
	st.insert(1);
	for(set::iterator it=st.begin();it!=st.end();it++)
		cout<<(*it)<

set的常用方法:

insert()

时间复杂度O(logn)

find()

时间复杂度O(logn)

erase()

删除单个元素时,可以写某个元素的迭代器或者是value。

删除一个区间时,st.erase(first,last) last为开区间。

size()

时间复杂度O(1)

clear()

时间复杂度O(n)

自定义排序规则:

有时候set中使用的数据类型是结构体或者是其他stl容器,这时候就需要我们自定义set的排序规则。

排序规则:

set的排序规则与sort的排序规则相同。return a>b时,是按照降序排序。

例子:

对结构体:

只需写好排序规则cmp,然后声明变量时写为:set 即可。

#include
#include
#include
#include 
using namespace std;
struct node{
	node(){
	}
	node(int a,int b){
		x=a,y=b;
	}
	int x,y;
};
struct cmp{
	bool operator()(node t1,node t2){
		return t1.x>t2.x;//排序结果与sort相同。 
	}
};
int main(){
	set st;
	st.insert(node(1,2));
	st.insert(node(3,5));
	cout<<(*st.begin()).x<

对其他容器:

以pair举例:和结构体差不多。

#include
#include
#include
#include 
using namespace std;

struct cmp{
	bool operator()(pair p1,pair p2){
		return p1.first>p2.first;//排序结果与sort相同。 
	}
};
int main(){
	set,cmp> st;
	st.insert(make_pair(1,2));
	st.insert(make_pair(3,5));
	cout<<(*st.begin()).first<

multiset:

multiset也是有序的,对基本变量的排序默认是升序,对自定义类型要声明排序规则。但是他里面可以有重复元素(不会去重)。

传送门

例题:1372:小明的账单(ybt)

你可能感兴趣的:(STL)