强大的set容器

前言

建议先看STL里的map,该文章中的set只是对STL的一种补充,事实上map的功能比set强大很多,基本上用set能实现的功能用map也能实现

基本函数

用法 作用
s.begin(), s.end() 返回集合的首尾迭代器
s.insert(k) 向集合中加入元素k
s.earse(k) 删除集合中元素k
s.size() 返回当前集合的元素个数
s.find(k) 返回集合中指向元素k的迭代器。如果不存在这个元素,就返回s.end()
s.empty() 返回当前集合是否为空,是返回1,否则返回0
s.clear() 清空当前集合。
s.upper_bound() 返回一个键值大于k的第一个元素的迭代器
s.lower_bound 返回一个键值大于等于k的第一个元素的迭代器

用法与map大量相似,这里只简单介绍下二者的区别

查询值

set不像map有键值和value,需要用it->first和it->second来返回对应的键值和value。set只有一个数值,取其数值只需要对迭代器进行取值符号即可

int main(){
    
    
	set<int>::iterator it;
	for(it=s.begin();i!=s.end();it++)cout<<*it<<" ";
	
	return 0;
}

二分查找的函数

set支持lower_bound和upper_bound函数,可以查找键值大于k的第一个元素的迭代器

int main(){
    
    
	set<int>::iterator it;
	it=s.lower_bound(k);
	cour<<*it;
	return 0;
}

事实上也可以用另一种方法实现,就是先将k插入,然后去查找k所对应的迭代器的下一位,返回其值并将k删除即可

set<int>s;
int main(){
    
    
	set<int>::iterator it;
	if(s.find(k)!=s.end()){
    
    
		it=s.find(k);
		it++;
		cout<<*it;
	}
	else {
    
    
		s.insert(k);
		it=s.find(k);
		it++;
		cout<<*it;
		s.erase(k);
	}
	return 0;
}

个人理解

map一般用来实现有关字符串的对应值问题,而set更加关注数字集合的关系,使用set一般是为了解决两个问题:去重和排序
不再展示其用法

思考一个问题

使用set会自动排序,如果我只想去重,不想排序怎么办??

猜你喜欢

转载自blog.csdn.net/weixin_43602607/article/details/109357089