1 set介绍

(1)set是STL中一个很有用的容器,用来存储同一种数据类型的数据结构(可以称之为K的模型),基本功能与数组相似。
(2)set与数组不同的是,在set中每个元素的值都是唯一的。
(3)而且set插入数据时,能够根据元素的值自动进行排序。
(4)set中数元素的值并不能直接被改变。

2 set的底层

(1)set的底层是红黑树,是红黑树里面K的模型;

K模型:表示只能存放同一种数据类型
KV模型:表示能存放两种数据类型

(2)map的底层也是红黑树,而它是KV模型。
(3)set不允许插入重复数据,而multiset允许插入相同的数据。

补充:multiset:multiset功能与set类似,接口也基本一样,最主要的区别是:set不允许数据冗余,而multiset允许数据冗余

3 set里面的一些变量定义

(1)set的模板参数介绍

template < class T,                        // 表示set里面存放的数据类型class Compare = less<T>,        // 仿函数,可以指定让set按照什么方式进行比较数据class Alloc = allocator<T>     // 空间配置器,默认是系统提供的>

(2)第二个模板参数Compare为仿函数,表示按照何种方式进行数据的比较,因为set进行遍历是有序的,当前仿函数的比较方式让set遍历的序列是递增的序列;如果想要让set遍历的序列为递减序列,就可以将第二个模板参数改为greater;另一方面如果set里面存放的是自定义类型,则必须自己实现一个仿函数用于支持两个自定义类型大小的比较。
(3)第三个模板参数Alloc为空间配置器。

4 set相关接口介绍

4.1 插入数据(接口为insert)

set的进行数据的插入有三种方式

pair<iterator,bool> insert (const value_type& val);iterator insert (iterator position, const value_type& val);template <class InputIterator>
void insert (InputIterator first, InputIterator last);
4.1.1 pair介绍:

(1)pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
(2)pair的实现:

template<class T1,class T2>
struct pair
{pair(T1 _first, T2 _second):first(_first), second(_second){}T1 first;T2 second;
};

(3)将两个数据合成一个数据不仅可以使用pair创建对象的方式,还可以用make_pair,make_pair是一个模板函数。
make_pair的实现:

template<class T1,class T2>
pair<T1, T2> make_pair(T1 first, T2 second)
{
    return pair<T1, T2>(first, second);
}
4.1.2 插入方式介绍

1.方式1:pair<iterator,bool> insert (const value_type& val);
(1)返回一个pair,pair里面包含两种数据类型,一个是迭代器,一个是bool类型;
(2)pair的第一个参数为该set的迭代器,表示如果插入一个set里面不存在的数据,则迭代器指向这个新增结点,如果插入一个set里面已经存在的数据,则迭代器指向已经存在的数据;
(3)pair的第二个参数为bool类型,表示如果是true,则数据成功插入,如果为false则表示插入的数据已经存在。

2.方式2:在某个位置上插入一个数据,iterator insert (iterator position, const value_type& val);

3.方式3:将一个区间的数据插入

template <class InputIterator>
void insert (InputIterator first, InputIterator last);

InputIterator为迭代器的类型

注意:multiset返回的都是新的数据(因为不论数据是否存在,都会成功插入除非内存已满,内存满也会抛异常)。

4.2 set的遍历
4.2.1 遍历方式介绍

(1)用迭代器(默认是采用升序方式,如果采用反向迭代器或者将仿函数由默认less改成greater则可以输出降序的数据);
①正向迭代器

set<int>::iterator it1 = s.begin();
while (it1 != s.end())
{cout << *it1 << " ";++it1;
}

②反向迭代器

set<int>::reverse_iterator it1 = s.rbegin();
while (it1 != s.rend())
{cout << *it1 << " ";++it1;
}
cout << endl;

③const迭代器(C++11里面);

4.2.2 set进行遍历注意点

(1)红黑树的遍历是走的中序,则s.begin()是红黑树的最左结点;
(2)s.end()是最后一个数据的下一个位置;
(3)++it1仍然是按照中序的方式(左根右);

4.2.3 set删除数据(接口为erase)

(1)删除某个位置:

void erase (iterator position);
s.erase(s.find(5));

注意:如果利用该方式删除一个不存在的数据,应该要加判断,如:

set<int>::iterator pos = s.find(10);
if (pos != s.end())   //!=s.end()说明数据存在
{s.erase(pos);
}

(2)删除某个值(相当于Remove)

size_type erase (const value_type& val);
set<int> s;
s.insert(6);
s.insert(5);
s.insert(3);
s.insert(7);
s.insert(2);
s.insert(1);set<int>::iterator it1 = s.begin();
while (it1 != s.end())
{cout << *it1 << " ";++it1;
}cout << endl;s.erase(3);it1 = s.begin();while (it1 != s.end()){cout << *it1 << " ";++it1;}
}

注意:multiset删除某个值时,将里面与该值相等的所有数据全部删除。

(3)删除某个区间:void erase (iterator first, iterator last);
利用该方式删除的是一个左闭右开的区间;(即last表示最后一个删除数据的下一个位置);

4.2.3 set查找数据(接口为find)
 iterator   find (const value_type& val)  const;
4.2.4 count(统计数据是否存在于set里面)
size_type    count (const value_type& val)   const;

(1)返回值只有0或1;
(2)如果返回1说明查找的数据存在,如果查找的数据不存在则返回零。
注意:multiset的count返回该值出现的次数;

4.2.5 swap

(1)交换两个set,接口及参数如下:void swap (set& x);
(2)底层是将两个set的根进行交换

STL--set介绍及set的使用相关推荐

  1. C++ stl vector介绍

    转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if ...

  2. C++ STL 初步介绍01

    STL 提供了6大组件,彼此之间可以组合套用,这6大组件分别是: 容器,算法,迭代器,仿函数,适配器,空间配置器 简单介绍: 容器:各种数据结构,入vector,list, deque, set, m ...

  3. C++_标准模板库STL概念介绍5-其他库与总结

    C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...

  4. Linux C++ STL用法介绍(1)

    STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser ...

  5. stl文件介绍及读取

    STL文件规则 (1)共顶点规则 每一个三角面片必须与其相邻的每一个面片共两个顶点 ,即一个三角面片的顶点不能落在相邻的任何三角面片的边上; (2)取向规则 单个面片法向量符合右手法(ccw)则且其法 ...

  6. 2 STL迭代器介绍【前向迭代器、双向迭代器、随机访问迭代器】【迭代器遍历容器】

    文章目录 0 - 前言 1 - 迭代器定义 2 - 迭代器分类 3 - 迭代器使用 0 - 前言 参考:http://c.biancheng.net/view/6675.html 1 - 迭代器定义 ...

  7. 算法笔记.胡凡 第6章 C++标准模板库(STL)介绍

    6.1 vector常见用法详解 6.1.1.vector定义 vector<int> name; 6.1.2.vector容器元素访问 (1) 下标:v[0] (2)迭代器 vector ...

  8. stl源码剖析_STL源码剖析 阅读笔记(二)allocator

    一.空间分配器 allocator 从使用上看,空间分配在任何语言的任何组件都不需要我们去过多关心,因为语言.组件的底层肯定都比较完整的做了这件事情. 从实现上看,学习 allocator 的原理在源 ...

  9. 转:C++中STL用法总结

    转自:https://blog.csdn.net/piaoxuezhong/article/details/54348787 1.1 什么是STL? STL(Standard Template Lib ...

  10. C++STL之string类

    最近在准备ccfcsp,于是学习了一下STL标准库的string类,在此记录. 作为STL类介绍的第一篇文章,首先简单介绍一下为什么要用STL,原因就是解决了一个问题之后,就不要对这个问题再来做重复的 ...

最新文章

  1. 【图论技巧】点边转化(拆点和拆边)
  2. 常见加密工具类Base64、DES、AES、RSA、MD5汇总
  3. MySQL 修复root权限
  4. linux mysql temp 设置_linux上mysql的简单入门
  5. Prometheus学系列(十九)之PromQL基础
  6. 按揭买的房,房产证为什么要放在银行,自己要用房产证怎么办?
  7. linux下python_linux下python安装
  8. 一文总结 CPU 基本知识
  9. java解压服务器文件夹,java获取远程服务器上的文件夹
  10. A Data Access Layer to persist business objects using attributes and reflection - Part III [无常译]...
  11. HTML轮播图全宽,jq全兼容自适应宽度图片轮播(新手适用)
  12. linux架设subversion(svn)版本控制
  13. (转)Spring Boot 2 (三):Spring Boot 开源软件都有哪些?
  14. linux科学计算器设计,课内资源 - Linux环境下的多项式计算器的实现
  15. 全面解读php-流程控制
  16. ComponentArt Web.UI控件的bug及解决办法
  17. memcache的安装,配置和使用
  18. python-opencv Harris 角点检测
  19. arcgis生成等高线CAD无法识别高程
  20. c# WindowsForm上使用Panel制作画板的一些小功能

热门文章

  1. c语言多个大括号的作用,c语言大括号怎么用
  2. 【测试技能分享】xmind思维导图导出excel层级表格转换为测试场景案例分享实践附脚本
  3. radius认证服务器无响应,关于radius认证和portal认证服务器的一点问题
  4. windows10,实现远程桌面,更换远程桌面端口号
  5. C# - partial 关键字
  6. 清风数学建模学习笔记——系统(层次)聚类原理详解及案例分析
  7. 网关、路由器、局域网、广域网
  8. 使用服务器串口线连接到PC端的COM口
  9. 如何借鉴一个优秀的网站
  10. 完全二叉树的最后一个非终端节点的下标