C++进阶:STL容器-set

1. 简介

数学中的集合

No. 特性 说明
1 确定性 给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一。
2 互异性 一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集。
3 无序性 一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。

2. 操作

set特点值唯一。

2.1 初始化

  1. 默认构造(可带参数)
  2. 复制构造
  3. 范围赋值构造

2.2 基本操作

  • 迭代器
迭代器 作用
c.begin() 头迭代器
c.end() 尾迭代器
c.rbegin() 反向头迭代器
c.rend() 反向尾迭代器

vector相似。

  • 数据量操作
函数 作用
c.size() 大小
c.max_size() 最大大小
c.empty() 判空
c.clear() 清空

2.3 添加数据

  1. 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>判断插入数据是否成功。

  1. 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);
}

插入数据总是认为成功,如果已经存在,则返回已经存在的位置迭代器,否则,添加新的值,且返回位置迭代器。

  1. 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++11auto迭代器写法
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 查找

  1. count()判断值是否存在
if(m.count(val) == 1){
     ...
}
  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 删除

  1. 关键字删除
m.erase(val);
  1. 迭代器删除
m.erase(m.begin());
  1. 区域删除
m.erase(it_a,it_b);

2.8 排序

默认按照val升序排列。自定义排序时,可以在实例化加上valcomp仿函数或者重载<运算符。

set<value类型,comp> m;

3. 实例

  1. 如何把一个mapkey拆成一个set
  2. 如何把一个set和一个vector组成一个map

4. 练习

448. 找到所有数组中消失的数字

217. 存在重复元素

349. 两个数组的交集

287. 寻找重复数

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,003评论 18 399
  • STL(标准模板库),是目前C++内置支持的library。它的底层利用了C++类模板和函数模板的机制,由三大部分...
    岁与禾阅读 39,301评论 3 132
  • 前言: 详细介绍: List:元素有放入顺序,元素可重复Map:元素按键值对存储,无放入顺序Set:元素无放入顺序...
    YBshone阅读 12,794评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,676评论 19 139
  • 1.我的企业为客户提供的是冷冰冰、硬邦邦的产品,还是有灵魂和温度的产品? 2.我们对产品的定义是什么?企业的价值主...
    宾阁阅读 923评论 0 0