标准模板库(STL)学习指南之set集合
set是关联容器。其键值就是实值,实值就是键值,不可以有重复,所以我们不能通过set的迭代器来改变set的元素的值,set拥有和list相同的特性:当对他进行插入和删除操作的时候,操作之前的迭代器依然有效。当然删除了的那个就没效了。set的底层结构是RB-tree,所以是有序的。
stl中特别提供了一种针对set的操作的算法:交集set_intersection,并集set_union,差集set_difference。对称差集set_symeetric_difference,这些算法稍后会讲到。
一:set模板类的声明。
| template<   classkey   class=Traitsless<key>    classAllocator=allocator<key>>classset。 | 
其中个参数的意义如下:
key:要放入set里的数据类型,可以是任何类型的数据。
Traits:这是一个仿函数(关于仿函数是什么,我后面的文章会讲到)。提供了具有比较功能的仿函数,来觉得元素在set里的排列的顺序,这是一个可选的参数,默认的是std::less<key>,如果要自己提供这个参数,那么必须要遵循此规则:具有两个参数,返回类型为bool。
Allocator:空间配置器,这个参数是可选的,默认的是std::allocator<key>.
二:set里的基本操作
我们可以通过下面的方法来实例化一个set对象
std::set<int> s;那个s这个对象里面存贮的元素是从小到大排序的,(因为用std::less作为比较工具。)
如果要想在s里面插入数据,可以用inset函数(set没用重载[]操作,因为set本生的值和索引是相同的)
s.insert(3);s.insert(5).....
因为set是集合,那么集合本身就要求是唯一性,所以如果要像set里面插入数据和以前的数据有重合,那么插入不成功。
可以通过下面的方法来遍历set里面的元素
| 1 2 3 4 5 | std::set<int>::iterator it = s.begin();while(it!=s.end()){   cout<<*it++<<endl;//迭代器依次后移,直到末尾。} | 
如果要查找一个元素用find函数,it = s.find(3);这样it是指向3的那个元素的。可以通过rbegin,rend来逆向遍历
| 1 2 3 4 5 | std::set<int>::reverse_iterator it = s.rbegin();while(it!=s.rend()){  cout<<*it++<<endl;} | 
还有其他的一些操作在这就不一一列出了。
三:set向量的使用实例
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <iostream>#include <string>#include <set>#include <algorithm>#include <iterator>usingnamespacestd;/* 联合容器将值与关键字联合在一起,使用关键字来查找值,* 提供元素的快速访问,插入元素不能指定位置,容器自动处理插入位置* STL 提供四种联合容器:set、multiset、map、multimap* set、multiset 存储一种元素,前者关键字不可重复,后者关键字可以重复。* map、multimap 存储一对元素键与值,前者关键字不可重复,后者关键字可以重复。*/intmain(){    constintN = 3;    string s1[N] = {"xp","python","linux"};    string s2[N] = {"python","php","perl"};    set<string> sa(s1, s1 + N);// 声明一个集合sa,元素为数组s1    set<string> sb(s2, s2 + N);// 声明一个集合sb,元素为数组s2    set<string> sc;// 声明一个空集合sc    ostream_iterator<string, char> out (cout, " ");    copy(sa.begin(), sa.end(), out);    cout << "->set sa"<< endl;    copy(sb.begin(), sb.end(), out);    cout << "->set sb"<< endl;    set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), out);    cout << "->set_union() 并集"<< endl;    set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), out);    cout << "->set_intersection() 交集"<< endl;    set_difference(sa.begin(), sa.end(), sb.begin(), sb.end(), out);    cout << "->set_difference() 集合的差"<< endl;    set_difference(sb.begin(), sb.end(), sa.begin(), sa.end(), out);    cout << "->set_difference() 集合的差"<< endl;    set_union(sa.begin(), sa.end(), sb.begin(), sb.end(), insert_iterator<set<string> >(sc, sc.begin() ));    sc.insert("delphi");    copy(sc.begin(), sc.end(), out);    cout << "->set sc"<< endl;    copy(sc.lower_bound("perl"), sc.upper_bound("python"), out);    cout << "->显示集合区间"<< endl;    return0;} | 

作者:ACShiryu 
出处:http://www.cnblogs.com/ACShiryu/ 
若非注明,本博客文章均为原创,版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。 
该文章也同步发布在我的新浪微博中-ACShiryu's weibo,欢迎收听。
标准模板库(STL)学习指南之set集合的更多相关文章
- 标准模板库(STL)学习指南之sort排序
		对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ... 
- 标准模板库(STL)学习指南之List链表
		本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ... 
- 标准模板库(STL)学习指南之priority_queue优先队列
		转载自CSDN博客:http://blog.csdn.net/suwei19870312/article/details/5294016 priority_queue 调用 STL里面的 make_h ... 
- 标准模板库(STL)学习指南之map映射
		转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ... 
- 标准模板库(STL)学习指南之vector向量
		vector – 一. vector可以模拟动态数组 – 二. vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public 拷贝构造函数和重载的赋值操作符) 三.必须包含的头文 ... 
- 标准模板库(STL)学习探究之stack
		标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string 
- 标准模板库(STL)学习探究之vector容器
		标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ... 
- 标准模板库(STL)学习探究之Multimap容器
		C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素.(具体用法请参考map容器) 函数列表: begin() 返回指向第一个元素的迭代器 cle ... 
- STL学习系列之一——标准模板库STL介绍
		库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ... 
随机推荐
- struts2一个实例中遇到的问题
			今天实现了一个登录功能的Struts2小程序. 期间遇到了许多问题,记忆犹新的是 (1)新版本的tomcat9和eclipse Neon Release (4.6.0) 发生了冲突,启动服务器的时候老 ... 
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
			[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ... 
- 九度OJ 1345:XXX定律之画X (递归)
			时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:361 解决:157 题目描述: 给你一个n,然后让你输出F(n) 规则是这样的,F(n)的输出结果是: F(n-1) F(n-1) ... 
- nginx学习之web服务器(四)
			1. 定义一个虚拟服务器 http { server { # Server configuration } } 可以在http {}块里面添加多个server {}块,每一个server {}块代表一 ... 
- springboot工程自动生成工具
			1 springboot工程自动生成网址 http://start.spring.io/ 2 工具 Spring Boot CLI 
- sqlalchemy——基本操作
			以下所有代码片段都使用了统一的引用,该引用如下: from sqlalchemy import create_engine, ForeignKey from sqlalchemy.ext.declar ... 
- 算法(Algorithms)第4版 练习 2.3.17
			关键代码: public static void sort(Comparable[] a) { StdRandom.shuffle(a);//eliminate dependence on input ... 
- 算法(Algorithms)第4版 练习 1.5.3
			id数组和treesize数组变化情况: 0 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 1 10 components 9 0 1 2 3 4 5 6 7 8 9 1 1 ... 
- 分享知识-快乐自己:Struts2 拦截器 与 过滤器
			拦截器的使用以及配置: package com.gdbd.interceptor; import com.gdbd.pojo.UserInfo; import com.opensymphony.xwo ... 
- POJ1363 Rails 验证出栈序列问题
			题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ... 
