引入
集合和映射也是两个常用的容器。set就是数学上的集合——每个元素最多只出现一次。和sort一样,自定义类型也可以构造set,但同样必须定义“小于”运算符。

头文件
#include<set>(当然,如果愿意,你也可以用#include<bits/stdc++.h>这个万能库,但是会导致内存巨大。。。

声明

set<int > s;//普通的定义(不允许元素重复)
struct rec{...};set<rec > s;//结构体
multiset<double > s;//(允许集合中元素重复)
//注意:set和multiset存储的元素必须定义“小于号”运算符

size/empty/clear
与vector类似,分别为元素个数、是否为空、清空。前两者的时间复杂度为\(O(1)\)。

迭代器
set和multiset的迭代器称为“双向访问迭代器”(类似于指针),不支持“随机访问”,支持星号“*"解除引用,仅支持“++”和“- -”两个与运算相关的操作。
设\(it\)是一个迭代器,例如set<int > :: iterator it;
若把\(it\)++,则\(it\)将会指向下一个元素。这里的“下一个”是指在元素从小到大排序的结果中,排在\(it\)下一名的元素。同理,若把\(it\)- -,则\(it\)将会指向排在“上一个”的元素。
请注意,执行“++”和“- -”操作的时间复杂度都是\(O(log n)\)。执行操作前后,务必仔细检查,避免迭代器指向的位置超出首、尾迭代器之间的范围。

begin/end
返回集合的首、尾迭代器,时间复杂度为\(O(1)\)。
s.begin() 是指向集合中最小元素的迭代器。
s.end() 是指向集合中最大元素的下一个位置的迭代器。换言之,就像 vector 一样,是一个“前闭后开”的形式。因此 - -end() 是指向集合中最大元素的迭代器。

insert
s.insert(x) 把一个元素 x 插入到集合 s 中,时间复杂度为\(O(log n)\)。
在 set 中,若元素已存在,则不会重复插入该元素,对集合的状态无影响。

下面的代码把 n 个整数插入有序多重集 multiset ,并从小到大输出,时间复杂度\(O(n log n)\),相当于进行了一次排序。假设 n 个整数目前存储在数组 a[1~n]中。

multiset<int > s;
for(int i=1;i<=n;i++)s.insert(a[i]);
for(multiset<int > :: iterator it=s.begin();it!=s.end();it++)
cout<<*id<<endl;

find
s.find(x) 在集合s中查找等于 x 的元素,并返回指向该指针的迭代器。若不存在,则返回 s.end() 。时间复杂度\(O(log n)\)。

lower_bound/upper_bound
这两个函数的用法与 find 类似,但查找的条件略有不同,时间复杂度\(O(log n)\)。
s.lower_bound(x) 查找>=x 的元素中最小的一个,并返回指向该元素的迭代器。
s.upper.bound(x) 查找 >x 的 元 素中最小的一个,并返回指向该元素的迭代器。

erase
设 it 是一个迭代器, s.erase(it) 从 s 中删除迭代器 it 指向的元素,时间复杂度为\(O(log n)\)。
设 x 是一个元素, s.erase(x) 从 s 中删除所有等于 x 的元素,时间复杂度为\(O(k+logn)\),其中 k 为被删除的元素个数。
如果想从 multiset 中删掉至多1个等于 x 的元素,可以执行:

if((it==s.find(x))!=s.end())s.erase(it);

count
s.count(x) 返回集合 s 中等于 x 的元素个数,时间复杂度为\(O(k+logn)\),其中 k 为元素 x 的个数。

//刘汝佳大神的书《算法竞赛入门经典》上的例题:

[UVa 10815]Andy's First Dictionary 安迪的第一个字典

//此处贴上lrj资源包里的标程
//由于string已经定义了“小于”运算符,直接使用set保存单词集合即可#include<iostream>
#include<string>
#include<set>
#include<sstream>
using namespace std;set<string> dict;
string s, buf;int main() {while(cin >> s) {for(int i = 0; i < s.length(); i++)if(isalpha(s[i])) s[i] = tolower(s[i]); else s[i] = ' ';stringstream ss(s);while(ss >> buf) dict.insert(buf);}for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it)cout << *it << "\n";return 0;
}

转载于:https://www.cnblogs.com/Luvwgyx/p/8455273.html

C++ STL set(集合)相关推荐

  1. C++STL常用集合算法

    C++STL常用集合算法 学习目标 算法简介 set_intersection 功能描述 函数原型 示例 总结 set_union 功能描述 函数原型 示例 总结 set_difference 功能描 ...

  2. C++ STL map集合的使用

    有时需要根据索引找到对应的元素,像键值对一样的查找,并对这些元素进行操作.可以同故宫调用STL里面的map来解决这个问题. map关联集合的本质也是一棵红黑树,可以看做一个下标可以是任意类型的数组. ...

  3. C++ STL set集合的使用

    一些涉及到集合的算法题目,可以考虑使用STL里的set来很方便地解决问题. set的本质是红黑树(一种比较优秀的平衡二叉树). set集合需要用到的头文件是set: #include<set&g ...

  4. STL初步——集合Set

    『写在前面的一些基础语法』 1.定义 和 赋值 set<int> a={1,2}; set<char> b={"1","2"}; set ...

  5. 单词数 (STL set集合)

    单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...

  6. 【C++ 与 STL】集合:set

    方法: begin() 返回指向第一个元素的迭代器 clear() 清除所有元素 count() 返回某个值元素的个数 empty() 如果集合为空,返回true(真) end() 返回指向最后一个元 ...

  7. [C++STL]常用集合算法

    代码如下: #include <iostream> #include <vector> #include <numeric> #include <algori ...

  8. BZOJ3578:GTY的人类基因组计划2(集合hash,STL)

    Description GTY召唤了n个人来做实验,GTY家的房子很大,有m个房间一开始所有人都在1号房间里,GTY会命令某人去某个房间等待做实验,或者命令一段区间的房间开始实验,实验会获得一些实验信 ...

  9. 结合泛型与模板的STL.NET

    开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual ...

  10. C++STL常用算术生成算法

    C++STL常用集合算法 学习目标 注意 算法简介 accumulate 功能描述 函数原型 示例 总结 fill 功能描述 函数原型 示例 总结 学习目标 掌握常用的算术生成算法 注意 算术生成算法 ...

最新文章

  1. 先进一站式IP及定制
  2. ubuntu 恢复apt_apt-clone:备份已安装的软件包并在新的 Ubuntu 系统上恢复它们
  3. 国内AI视频课程资源盘点
  4. r语言直方图_R语言绘制频率直方图
  5. 华为驳斥鸿蒙六月上线,终于来了!华为鸿蒙6月初将正式上线手机
  6. 7-37 组个最小数 (20分)_波音737高度计上蹊跷的“8英尺”,09年土耳其航空1951号航班空难...
  7. win7备份工具_win7系统小白一键系统详细教程
  8. Knight Moves(信息学奥赛一本通-T1450)
  9. 区块链数学建模_试图通过高中数学课程来解释区块链
  10. 关于A+B+C问题4种语言的解决办法,Java、C语言、C++、Python
  11. python常用的库_这几个常用的python库你需要知道
  12. ural 1353. Milliard Vasya's Function
  13. java构造方法,构造代码块,静态代码块的执行顺序
  14. 【数据结构笔记11】二叉搜索树,动态查找,删除操作
  15. 【java学习之路】(javaWeb篇)001.HTML
  16. 个人取得工资、薪金所得应当如何缴纳个人所得税
  17. 内网即时通讯软件有哪些优点?
  18. 一个挺好用的生成GIF格式图片的小程序
  19. matlab sub2ind函数
  20. 如何一小时爬取百万知乎用户信息,并做简单的可视化分析?

热门文章

  1. 发布订阅模式 仿写Vue事件监听手写js实现
  2. CSS模块化方案分类
  3. 僧多粥少?还原 OpenStack 的真实“钱景”
  4. 【Android Studio安装部署系列】十一、Android studio获取数字签名信息
  5. Connection is not open httpClient 的问题解决方案
  6. 一台路由器实现电信ITV与宽带共享上网
  7. 【oracle】多个用户的对象 导出导入
  8. 设计人员珍藏的在线处理图片的网址大集合
  9. NoClassDefFoundError: org/apache/flink/metrics/MetricGroup
  10. Yarn的默认端口(转载)