set 是 C++ STL 中关于集合的库,和数学上的集合一样,元素具有唯一性,默认对元素从小到大进行排列。
注:multiset 中集合元素可以重复
能够进行一些集合操作,比如求交$\cap$,并$\cup$,差 等等。
一些基本操作
和其他大多数 STL 用法一样
set<int> s;
s.empty() //判断是否为空,为空时返回 true
s.size() //返回集合内元素个数
s.begin() //第一个元素的地址
s.end() //最后一个元素的后面的地址
s.clear() //删除全部元素
s.insert() //插入元素。
//可以插入数组中的元素,如 s.insert(a, a + n) 表示插入数组中下标从 0 到 n 的元素。
//由此可见它是能指定地址插入的。
s.erase() //删除元素。可以指定元素,也可以指定地址,所以可以删除区间内的元素。
s.find() //查找元素,返回的是它的地址,如果找不到返回 s.end()
s.count() //返回某个元素的个数
初始化
默认是从小到大排序的,但我们可以这样强行让它从大到小排序set<int, greater<int> >
,其实默认的也等价于 set<int, less<int> >
,第二个参数其实就是比较函数。
如何把一个数组强行转成 set 呢?像这样 set<int> s(a, a + n)
,就是把数组中下标为 0 到 n 的元素转到 set 中存起来。
所以初始化一个 set 时,可以直接用地址。
当然也可以复制另一个 set,比如 set<int> sb(sa)
迭代器
前向迭代器
set<int>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout << *it << ' ';
嗯,这样是正向从前往后依次输出集合内的元素。
反向迭代器
set<int>::reverse_iterator rit;
for(rit = s.rbegin(); rit != s.rend(); rit++)
cout << *rit << " ";
emmm,感觉没什么用。
修改
set 并没有修改这个东西,还是老老实实删除再重新插入吧。
一些高端操作
s.lower_bound() //返回第一个大于等于某个值的元素的地址
s.upper_bound() //返回第一个大于某个值的元素的地址
s.equal_range() //返回一个 pair 类型的数对,包含上面两个函数的返回值
成员函数表格
我才不会告诉你是从网上偷的
Member functions | Definition |
---|---|
begin() | 返回指向第一个元素的迭代器 |
clear() | 清除所有元素 |
count() | 返回某个值元素的个数 |
empty() | 如果集合为空,返回true |
end() | 返回指向最后一个元素的迭代器 |
equal_range() | 返回集合中与给定值相等的上下限的两个迭代器 |
erase() | 删除集合中的元素 |
find() | 返回一个指向被查找到元素的迭代器 |
get_allocator() | 返回集合的分配器 |
insert() | 在集合中插入元素 |
lower_bound() | 返回指向大于(或等于)某值的第一个元素的迭代器 |
key_comp() | 返回一个用于元素间值比较的函数 |
max_size() | 返回集合能容纳的元素的最大限值 |
rbegin() | 返回指向集合中最后一个元素的反向迭代器 |
rend() | 返回指向集合中第一个元素的反向迭代器 |
size() | 集合中元素的数目 |
swap() | 交换两个集合变量 |
upper_bound() | 返回大于某个值元素的迭代器 |
value_comp() | 返回一个用于比较元素间的值的函数 |
Orz请问大佬的代码高亮用的啥插件呀?QvQ
Markdown编辑器WP Editor.md自带的高亮
基于 Prism.js(不过我的高亮在手机上看似乎不是等宽字体)
Emmm...
Magic。。。
以前我也用的是那个Markdown编辑器。。。
但貌似它太臃肿了,啥数学公式代码高亮都带。。。
于是就不用了。。。
它的功能确实太多了,所以把一些不用的功能关了。不过它自带的图片粘贴功能挺好用的。
P.S. 您的评论邮件提醒太好用啦 QwQ