/* 联合容器将值与关键字联合在一起,使用关键字来查找值,

* 提供元素的快速访问,插入元素不能指定位置,容器自动处理插入位置

* STL 提供四种联合容器:set、multiset、map、multimap

* set、multiset 存储一种元素,前者关键字不可重复,后者关键字可以重复。

* map、multimap 存储一对元素键与值,前者关键字不可重复,后者关键字可以重复。

*/

set 是关联容器。其键值就是实值,实值就是键值,不可以有重复(如果需求要求是可重复的,则请使用multiset),所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当 对他进行插入和删除操作的时候,操作之前的迭代器依然有效。当然删除了的那个就没效了。set的底层结构是RB-tree,所以是有序的。平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。

Set的特性:

1.stl中特别提供了一种针对set的操作的算法:交集set_intersection,并集set_union,差集set_difference,对称差集set_symeetric_difference。

set模板类的声明:

template <

class key

class =Traitsless<key>

class Allocator=allocator<key>

>

class set。

其中个参数的意义如下:

key:要放入set里的数据类型,可以是任何类型的数据。

Traits:这是一个仿函数(关于仿函数是什么,我后面的文章会讲到)。提供 了具有比较功能的仿函数,来觉得元素在set里的排列的顺序,这是一个可选的参数,默认的是std::less<key>,如果要自己提供这 个参数,那么必须要遵循此规则:具有两个参数,返回类型为bool。

Allocator:空间配置器,这个参数是可选的,默认的是std::allocator<key>.

遍历迭代器:

普通迭代器:

std::set<int>::iterator it = s.begin();

while(it!=s.end())

{

cout<<*it++<<endl;//迭代器依次后移,直到末尾。

}

反向迭代器:

std::set<int>::reverse_iterator it = s.rbegin();

while(it!=s.rend())

{

  cout<<*it++<<endl;

}

插入迭代器:

插入迭代器(Insert Iterator),又叫插入器(Inserter),是继上次的反向迭代器之后C++中的又一个迭代器适配器。插入迭代器的主要功能为把一个赋值操作转 换为把相应的值插入容器的操作。插入迭代器对标准算法库而言尤其重要。算法库对所有在容器上的操作有个承诺:决不修改容器的大小(不插入、不删除)。有了 插入迭代器,既使得算法库可以通过迭代器对容器插入新的元素,又不违反这一承诺,即保持了设计上的一致性。

插入迭代器提供了以下几种操作:*itr,itr++,++itr,itr = value。但实际上,前三种操作为“空操作”(no-op),仅仅返回itr。第四种操作itr = value才是插入迭代器的核心,这个操作通过调用容器的成员函数(push_back(),push_front(),insert(),取决于插入器 类型)把value插入到插入器对应容器的相应的位置上。

插入迭代器分为三种类型:尾部插入器(back_insert_iterator),首部插入器(front_insert_iterator)和普通插 入器(insert_iterator)。第一种通过调用容器的push_back成员函数来插入元素,因此这种插入器只对 vector,list,deque和string有效。 第二种通过调用容器的push_front成员函数来插入元素,因此它只对list和deque有效。第三种通过调用insert成员函数来插入元素,并 由用户指定插入位置,它对所有标准的容器类型都有效,因为所有容器都定义了insert成员函数。

ostream_iterator

ostream_iterator属于I/O流STL适配器

自定义比较函数

使用insert将元素插入到集合中去的时候,集合会根据设定的比较函数奖该元素放到该放的节点上去。在定义集合的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值从小到大的顺序插入元素。但在很多情况下,需要自己编写比较函数。

编写比较函数有两种方法。

(1)如果元素不是结构体,那么可以编写比较函数。下面的程序比较规则为按键值从大到小的顺序插入到集合中。

#include "stdafx.h"

#include<iostream>

#include<set>

using namespace std;

struct mycomp

{

//自定义比较函数,重载“()”操作符

bool operator() (const int &a, const int &b)

{

if(a != b)

return a > b;

else

return a > b;

}

};

int main()

{

set<int, mycomp> s; //采用比较函数mycomp

s.insert(5); //第一次插入,可以插入

s.insert(1);

s.insert(6);

s.insert(3);

s.insert(5); //第二次插入,重复元素,不会插入

set<int,mycomp>::iterator it;

for(it = s.begin(); it != s.end(); it++)

cout <<*it<<" ";

cout << endl;

return 0;

}

(2)如果元素是结构体,那么可以直接把比较函数写在结构体内。

#include "stdafx.h"

#include<iostream>

#include<set>

using namespace std;

struct mycomp

{

//自定义比较函数,重载“()”操作符

bool operator() (const int &a, const int &b)

{

if(a != b)

return a > b;

else

return a > b;

}

};

int main()

{

set<int, mycomp> s; //采用比较函数mycomp

s.insert(5); //第一次插入,可以插入

s.insert(1);

s.insert(6);

s.insert(3);

s.insert(5); //第二次插入,重复元素,不会插入

set<int,mycomp>::iterator it;

for(it = s.begin(); it != s.end(); it++)

cout <<*it<<" ";

cout << endl;

return 0;

}

标准模板库(STL)学习指南之set集合相关推荐

  1. 标准模板库(STL)学习指南之List链表

    本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...

  2. 标准模板库(STL)学习指南之List容器

    原文地址:http://dozb.bokee.com/1872684.html [文章导读] STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件 [正文] 什么是STL呢?STL就是St ...

  3. 标准模板库(STL)学习指南之map映射

    转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...

  4. 标准模板库(STL)学习指南之vector向量

    vector – 一.  vector可以模拟动态数组 – 二.  vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符) 三.必须包含的头文 ...

  5. 标准模板库STL学习总结

    标准模板库就是类与函数模板的大集合.STL共有6种组件:容器,容器适配器,迭代器,算法,函数对象和函数适配器. 1.容器: 容器是用来存储和组织其他对象的对象.STL容器类的模板在标准头文件中定义.主 ...

  6. C++标准模板库STL学习

    STL是所有C++编译器和所有操作系统平台都支持的一种库,可以用于所有C++语言编译器和所有平台(Windows/Unix/Linux..).当然标准查模板库中的所有算法,也可以自己用C/C++来实现 ...

  7. C++标准模板库(STL)学习精要,看此文再配合参考手册轻松成高手!

    这一篇主要对C++中使用最广泛的STL进行学习梳理,参照此文再配合STL参考手册,轻松掌握编程精要! 1.STL基本头文件 STL主要包含容器.算法和迭代器三个部分.容器实现了大多数数据结构:迭代器类 ...

  8. 标准模板库(STL)学习探究之Multimap容器

    C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素.(具体用法请参考map容器) 函数列表: begin() 返回指向第一个元素的迭代器 clear() 删除所有元素 c ...

  9. 标准模板库STL(Standard Template Library)

    标准模板库STL(Standard Template Library)指南 /*刘振飞liuzf@pku.org.cn 1999-10-20*/ / *版权所有 (C) 1999-2004 刘振飞li ...

最新文章

  1. STM32 GPIO的原理、特性、选型和配置
  2. sql语句查询性能的优化思想(个人理解)
  3. python管理包管理工具pip和conda使用,及使用pip和conda创建虚拟环境
  4. maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
  5. Oracle中case when用法
  6. struct、union、enum and sizeof
  7. IntelliJ IDEA、Kotlin、PyCharm 背后公司 JetBrains 遭美国调查!
  8. java delete方法返回值_boolean delete()
  9. html页面画一个矩形,使用HTML5 canvas绘制一个矩形的方法
  10. 数据结构1800题-错题集-第五章
  11. HTML基础教程笔记(HTML5与CSS3基础教程书)
  12. python实现素数判断
  13. 基于二阶矩阵的优化问题(一)线搜索策略(附matlab代码)
  14. Linux权限中x是什么意思,linux里的drwxr-xr-x代表的意思
  15. 电脑系统安装后桌面图标隔开很宽怎么调?
  16. 亚马逊云科技物联网产业创新峰会与你相聚蓉城
  17. 美女图片采集器 源码+解析
  18. 如何屏蔽百度搜索推广
  19. 【计算机毕业设计】437物流管理系统设计与实现
  20. 建立自己的封装库(二)

热门文章

  1. 定义简单类-接收对象的变量同样是对对象的引用
  2. Spring Boot定时任务-Job类对象注入
  3. hystrix-dashboard
  4. Base64编码 - Java加密与安全
  5. html中加入一个计时器,向html中的计时器添加毫秒
  6. java i o流异常问题_第四章 Java的I/O流和异常处理
  7. 书生阅读器打开gd文件出错_CAJ论文怎么打开?
  8. dbeaver导出建表语句_细致入微:如何使用数据泵导出表的部分列数据
  9. 优化 UI 应用启动时间的方法
  10. build.xml引用其它文件的任务