前言
建议先看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会自动排序,如果我只想去重,不想排序怎么办??