STL的集合set
集合:
集合是由元素组成的一个类,其成员可以是一个集合,也可以是一个原子,通常一个元素在一个集合中不能多次出现;由于对实现集合不是很理解,只简单写下已有的STL中的set集合使用;
C++中set基本运算及操作:
begin():返回指向第一个元素的迭代器
clear():清除所有元素;
empty():判断集合是否为空,若为空,返回true;
end():返回指向最后一个元素的迭代器;
size():返回集合中元素的数目;
lower_bound():返回指向大等于某值的第一个元素的迭代器;
set_union():合并两个集合;
set_intersection():两个集合的交集;
set_difference():前面集合对后面集合的差集;
合并集合:
调用代码:
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
struct Stu
{
int ID;
int val;
};
struct cmp
{
bool operator()(const Stu& t1, const Stu& t2)
{
if (t1.val<t2.val)return true;
else if (t1.val == t2.val)
{
if (t1.ID<t2.ID)return true;
}
else return false;
}
};
int main()
{
set<Stu, cmp>s1;
set<int>s2;
set<int>s3;
set<int>uni;
set<int>inter;
set<int>dif;
Stu stu1, stu2, stu3;
stu1.val = 80; stu2.val = 85; stu3.val = 85;
stu1.ID = 31602114; stu2.ID = 31602113; stu3.ID = 31602115;
s1.insert(stu1); s1.insert(stu2); s1.insert(stu3);
s2.insert(10); s2.insert(13); s2.insert(54); s2.insert(7);
s3.insert(1);s3.insert(12);s3.insert(54);s3.insert(13);
printf("整型数据输出:\n");
set<int>::iterator int_iter;
set<Stu, cmp>::iterator Stu_iter;
for (int_iter = s2.begin(); int_iter != s2.end(); int_iter++)
printf("%d ", *int_iter);
printf("\n\n");
printf("自定义数据输出:\n");
for (Stu_iter = s1.begin(); Stu_iter != s1.end(); Stu_iter++)
printf("学号:%d 成绩:%d\n", Stu_iter->ID, Stu_iter->val);
printf("\n\n");
printf("并集,交集,差集函数使用:\n");
set<int>::iterator s;
set_union(s2.begin(),s2.end(),s3.begin(),s3.end(),inserter(uni,uni.begin())); //s2与s3的并集 ,放入到uni中了 ;
set_intersection(s2.begin(),s2.end(),s3.begin(),s3.end(),inserter(inter,inter.begin())); //s2与s3的交集 ,放入到inter中了;
set_difference(s2.begin(),s2.end(),s3.begin(),s3.end(),inserter(dif,dif.begin())); //s2对s3的差集 ,放入到dif中了;
for(s=uni.begin();s!=uni.end();s++)
printf("%d,",*s);
printf("\n");
for(s=inter.begin();s!=inter.end();s++)
printf("%d,",*s);
printf("\n");
for(s=dif.begin();s!=dif.end();s++)
printf("%d,",*s);
printf("\n");
return 0;
}

这里讲到lower_bound就简要写一下lower_bound的使用:假设存在一个数组num[]:5,16,19,75,94,101;位置变量pos;
pos=lower_bound(num,num+6,15);
即pos返回的是第一个比15大等的元素的位置,此时pos=1;
pos=lower_bound(num,num+6,110);
pos是返回第一个比110大等的元素的位置,若不存在,则返回最右端元素的下一位下标,即size;此时pos=6;
lower_bound的核心思想:使用二分法对元素进行查找;
大致实现源代码:
//这个算法中,first是最终要返回的位置
int lower_bound(int *array, int size, int key)
{
int first = 0, middle;
int half, len;
len = size;
while(len > 0) {
half = len >> 1;
middle = first + half;
if(array[middle] < key) {
first = middle + 1;
len = len-half-1; //在右边子序列中查找
}
else
len = half; //在左边子序列(包含middle)中查找
}
return first;
}
还有需要自己实现的集合代码没有学习,之后有空再补上吧;
STL的集合set的更多相关文章
- STL语法——集合:set 安迪的第一个字典(Andy's First Dictionary,UVa 10815)
Description Andy, , has a dream - he wants to produce his very own dictionary. This is not an easy t ...
- C++ STL Set 集合
前言 set是STL中的一种关联容器.集合具有无序性,互异性等特点.熟练使用STL中的set模板类,可以比较简单的解决一些编程问题. 关联容器:元素按照关键字来保存和访问,STL中的map,set就是 ...
- (转)C++ STL set() 集合
set是STL中一种标准关联容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是标准关联容器),它底层使用平衡的搜索树——红黑树实 ...
- 【STL】集合运算
STL中有可以实现交集.并集.差集.对称差集的算法. 使用前需要包含头文件: #include <algorithm> 注:使用计算交集和并集的算法必须保证参与运算的两个集合有序!!! 交 ...
- STL&&用法集合
.....STL是c++里很强势很好用的一系列容器(函数)之类的,之前一直不太会用,所以总是暴毙....想着快比赛了,是时候理一下这些东西了. -1.pair 存放两个基本元素的东西 定义方法: pa ...
- C++ STL set集合容器
汇总了一些set的常用语句,部分参考了这篇:http://blog.163.com/jackie_howe/blog/static/199491347201231691525484/ #include ...
- stl的集合set——安迪的第一个字典(摘)
set就是数学上的集合——每个元素最多只出现一次,和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符 以下代码测试set中无重复元素 #include<iostream&g ...
- STL set集合用法总结(multiset)
2017-08-20 15:21:31 writer:pprp set集合容器使用红黑树的平衡二叉树检索树,不会将重复键值插入,检索效率高 logn 检索使用中序遍历,所以可以将元素从小到大排列出来 ...
- 单词数 (STL set集合)
单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情.就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...
随机推荐
- Delphi的idhttp报IOHandler value is not valid错误的原因
出现这种问题的原因是由于访问的 URL地址为https或存在其跳转地址为https. 首先单纯使用idhttp是只能访问http,而https则需要搭配IdSSLIOHandlerSocketOpen ...
- msserver的update or insert语句
方案1:SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; IF EXISTS (SELECT 1 FROM dbo.ta ...
- redis集群搭建+lua脚本的使用
详细参考这篇文章(windows) https://blog.csdn.net/qiuyufeng/article/details/70474001 一.使用JAVA代码操作redis集群 publi ...
- 【转载】COM 组件设计与应用(十八)——属性包
原文:http://vckbase.com/index.php/wv/1265.html 一.前言 书接上回,本回着落在介绍属性包 IPersistPropertyBag 接口的实现方法和调用方式.属 ...
- 2653: middle
2653: middle 链接 分析: 二分答案+主席树. 对于中位数的经典做法,就是二分一个数,将小于的变成-1,大于等于的变成+1,那么如果sum>=0(因为+1包括等于),L=mid+1, ...
- window下查杀占用端口的进程
一. 查找占用的端口进程号,比如8080 C:> netstat –ano|findstr 8080 C:\Users\chry>netstat -ano | findstr 8080 T ...
- pycharm安装第三方库失败解决办法
一.报错信息:[file][Default Settint]---Project Interpreter 点击 搜索suds安装模块报错 解决:依据上图提示找到C:\Program Files\Jet ...
- matplotlib简单示例
一.简介 以下引用自百度百科 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,开发者可以仅需要 ...
- OpenGL学习笔记(6) 基础光照的计算方法
这个笔记只是冯氏光照模型下漫反射光以及镜面光照的计算方式的笔记 基础光照 基础光照分为环境光,漫反射光,镜面光照 环境光 环境光是一个常量,表示在没有光源的情况下物体的光 漫反射光 漫反射光分量的计算 ...
- 曾经的华为C面试题,一点就通
学习编程可以锻炼你的思维,帮助你更好地思考,创建一种我认为在各领域都非常有用的思维方式. 比尔盖茨 曾经的华为C面试题,一点就通 [问题区] 有两个变量x和y, x=10; y = 2 ...