1. 简介
数学中的集合
No. | 特性 | 说明 |
---|---|---|
1 | 确定性 | 给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一。 |
2 | 互异性 | 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集。 |
3 | 无序性 | 一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。 |
2. 操作
set
特点值唯一。
2.1 初始化
- 默认构造(可带参数)
- 复制构造
- 范围赋值构造
2.2 基本操作
- 迭代器
迭代器 | 作用 |
---|---|
c.begin() |
头迭代器 |
c.end() |
尾迭代器 |
c.rbegin() |
反向头迭代器 |
c.rend() |
反向尾迭代器 |
与vector
相似。
- 数据量操作
函数 | 作用 |
---|---|
c.size() |
大小 |
c.max_size() |
最大大小 |
c.empty() |
判空 |
c.clear() |
清空 |
2.3 添加数据
-
insert
插入数据
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
cout << val << endl;
}
int main(){
set<int> m;
for(int i=0;i<10;i++){
m.insert(i);
}
for_each(m.begin(),m.end(),Display);
}
通过返回值pair<iterator,bool>
判断插入数据是否成功。
-
insert
指定位置插入数据
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
void Display(int val){
cout << val << endl;
}
int main(){
set<int> m;
for(int i=0;i<10;i++){
m.insert(i);
}
m.insert(m.begin(),100);
for_each(m.begin(),m.end(),Display);
}
插入数据总是认为成功,如果已经存在,则返回已经存在的位置迭代器,否则,添加新的值,且返回位置迭代器。
-
insert
插入范围数据
2.4 遍历
- 迭代器
for
循环
for(set<int>::iterator it = m.begin();it != m.end();it++){
cout << *it << endl;
}
-
for_each()
循环[推荐]
定义函数指针
inline void Display(int val){
cout << val << endl;
}
执行for_each
for_each(m.begin(),m.end(),Display);
- C++11
auto
迭代器写法
for(auto it = m.begin();it != m.end();it++){
cout << *it << endl;
}
- C++11 for-loop-scope迭代器写法[推荐]
for(auto p : m){
cout << p << endl;
}
- C++11
for_each()
与lamdba表达式
for_each(m.begin(),m.end(),[](int p){
cout << p << endl;
});
2.5 查找
-
count()
判断值是否存在
if(m.count(val) == 1){
...
}
-
find()
判断值是否存在以及位置
set<int>::iterator it = m.find(val);
if(m.end() != it){
...
}
2.6 区域查找
成员变量 | 作用 |
---|---|
m.lower_bound(val) |
val 下边界 |
m.upper_bound(val) |
val 上边界 |
m.equal_range(val) |
val 上下边界 |
2.7 删除
- 关键字删除
m.erase(val);
- 迭代器删除
m.erase(m.begin());
- 区域删除
m.erase(it_a,it_b);
2.8 排序
默认按照val
升序排列。自定义排序时,可以在实例化加上val
的comp
仿函数或者重载<
运算符。
set<value类型,comp> m;
3. 实例
- 如何把一个
map
的key
拆成一个set
- 如何把一个
set
和一个vector
组成一个map