某些STL用法
STL大法好!
stable_sort
基于归并排序,时间复杂度稳定同时并不会改变相对顺序,平替sort,用法一模一样。(可以过一些甚至卡sort的毒瘤,但是由于sort是均摊复杂度 \(O(nlogn)\),因此sort在某些题中会快一点,如SA)
bitset
按照 Oi Wiki 的说法,bitset严格上来说并不是STL,但是其应用非常的广泛,运用在各类复杂度错误但不多的题中去优化常数,一般而言可以优化32倍然后就可以卡过了
- 定义:bitset<1000> bs; 这里的1000指的是其位数,大概可以理解为你开了1000个bool变量,只是比存储空间及时间比bool小得多。
- 初始化:对于bitset的初始化与其他STL有很大不同。
全部设为一:bitset <16> (0xFFFF),其中一个F代表4个1
自由设置:bitset<8> b("10110101"),直接用字符串定义也很常用
用一种bitset也可以直接去初始化另一个bitset,
std::bitset<8> original("10101010");
// 使用original初始化另一个bitset
std::bitset<8> a(original);
- 操作位:
b.set(); // 将所有位设置为1
b.set(loc);//将某一位改为1
b.reset(); // 将所有位设置为0
b.reset(loc);//将某一位改为0
b.flip(); // 翻转所有位的值
b.flip(loc);//翻转某一位
- 访问位:
b.test(loc)会返回一个bool值。注意是从编号0开始的。
b.count()返回一个整数(是unsigned的吗?不知道,没人说),表示这整个容器中1的值
b.size()返回容器大小。
b.any()是否有1
b.none()是否全0
b.all()是否全1
b._Find_next(pos)寻找第pos后的第一个1.注意不包括pos位本身。如果后面没有1了,就会返回bitset<N>::npos
同时,bitset支持各种逻辑运算,可以直接将两个bitset与、或、异或起来,相当方便。
set
set作为一种非常强大的容器,支持各种类型的操作。
set <int> st 可以定义一个set
st.emplace(x) 插入一个值x
st.find(x) 找到某个值x 所表示的迭代器
st.erase(x) 删除一个数。这里x可以是指删除某一个数值为x的数,也可以是一个迭代器表示删除这个迭代器所代表的数。
如 st.erase(st.find(30)),但是要注意30是否在这个set中,如果不在find会返回st.end(),会导致RE。所以一般而言前面会加一个判断
同时,erase会返回下一个有效的迭代器。
st.size() 询问大小 。st.empty() 判断是否为空。
同时,其插入后的序列是直接有序的,同时 \(\log\) 级的运算量,可以直接使用lower_bound等查找或者去重等需要有序的函数。
注意lower_bound()和upper_bound() 返回的都是迭代器。
同时set里的这两个函数有些特殊,其是特别封装了的,有:
st.lower_bound(x) 返回值x的迭代器。
与vector不一样的是,在正常的编程中,set对于迭代器的使用会更广泛,因为各种函数返回的都是迭代器,而vector一般有直接返回值的替代品。
一般而言可以通过一种偷懒的办法定义一个迭代器:
auto it=st.begin();
这时系统会知道你在定义一个迭代器。但是请保证 原set不为空。否则会运行时错误。
如果需要传统的定义一个迭代器,有:
set<int>::iterator it;
使用 *it 即可调用这个迭代器所表示的值。
通过for(const auto& val:st) 来遍历整个set。注意这里的val直接就是set里的数值,不是迭代器,不需要加上'*'号。
pair
事实上,简单的 pair 也属于STL的范畴,同时其应用很广。有些时候一些c++标准库自带的返回值就是pair类型。需要通过一些方式来快速的理解,有效的维护并使用这些返回值。
头文件:#include <utility>。
定义:pair <int,bouble> p1(1,0.11);
访问值:cout<<p1.first<<' '<<p1.second;
二元关系:(按 first 项为第一关键字,second 项为第二关键字)
pair<int, int> p2(1, 2), p3(1, 3);
cout << (p2 < p3) << std::endl; // 输出 1
由于 map 和 unordered_map 有两个参数,因此其函数返回值很多都是 pair 类型的。
例如:std::map<int, std::string> 的每个元素是一个 std::pair<const int, std::string>。
例如,定义一个 map 类型,其 .begin() 的返回值就是 pair 类型。(注意 map 中的所有元素都是有序的)
map <int,int> mp;mp[3]=2,mp[2]=2;
int u,v;tie(u,v)=*mp.begin();
cout<<u<<' '<<v<<'\n';
这里的 tie(u,v) 指的是将后面的 pair 类型的 first 项与second 项分别放到 \(u,v\) 中。
注意这里的 mp[top].begin() 返回的是一个 map 的迭代器,而 *mp[top].begin() 则是解引用后的键值对(pair 类型)
某些STL用法的更多相关文章
- 算法拾遗[4]——STL用法
主要bb一下优先队列和字符串吧. 哦还有 bitset. 优先队列 定义很容易: priority_queue<int> pq; 内部是一个堆. 基本操作 pq.top() 取堆顶元素; ...
- STL&&用法集合
.....STL是c++里很强势很好用的一系列容器(函数)之类的,之前一直不太会用,所以总是暴毙....想着快比赛了,是时候理一下这些东西了. -1.pair 存放两个基本元素的东西 定义方法: pa ...
- STL用法之set
[C++::STL]之set的用法 c++ set求差集,并集,交集
- STL用法总结
stringstream用法:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为. stream << i 将i输入流中 stream >> ...
- STL用法整理
百度百科 STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称.从根本上说,STL是一些“容器”的集合,这些“容器”有list,vect ...
- STL用法大全
1. 概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...
- [笔记]一些STL用法
参考资料:STL 在 OI 中的应用 离散化 std::unique 功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复出现的元素依次排在后面 返回值:返回迭代器,迭代器指向的是重复元 ...
- 转:栈和队列小知识【STL用法】
原文出处:http://blog.csdn.net/chenzhenyu123456/article/details/44519943 栈: (一)头文件 #include<stack> ...
- STL用法
map.find(key) 获取map容器中指定键值x的元素,如果找到,返回此元素的迭代器,否则返回map::end()的迭代器(即查找到容器的末尾都没有找到此元素).
- C++ STL用法总结(持续更新)
Vector 动态数组 https://www.cnblogs.com/zhonghuasong/p/5975979.html lower_bound&&upper_bound htt ...
随机推荐
- pycharm上传github问题:rejected
我从pycharm上传项目时,遇到的问题: 以下是一些解决思路: 这个错误提示表明,你在尝试将本地代码推送到远程仓库时,远程仓库中已经包含了你本地尚未获取的更改.换句话说,远程仓库的代码比你的本地代码 ...
- [BZOJ3600] 没有人的算术 题解
妙不可言!妙绝人寰! 单点修,区间查,包是线段树的.考虑如何比较两节点大小. 考虑二叉搜索树,我们只要再给每个节点附一个权值,就可以比较了! 注意力相当惊人的注意到,假如给每个点一个区间 \([l_x ...
- [CERC2014] Parades 题解
感觉长脑子了. 考虑在路线两端点的 \(lca\) 计算贡献,那么线段可以分两类: \(u\) 为 \(v\) 祖先. \(u,v\) 互不为祖先. 设 \(dp_i\) 表示只考虑 \(i\) 子树 ...
- 附035.Kubernetes_v1.25.3高可用部署架构二
目录 部署组件 kubeadm介绍 kubelet介绍 kubectl介绍 方案概述 方案介绍 部署规划 节点规划 主机名配置 变量准备 互信配置 环境初始化 部署高可用组件 HAProxy安装 Ke ...
- (Python)用栈实现计算器的原理及实现
前言 我们日常使用的计算器是怎么实现计算的呢?能自己判断运算符的优先级去计算,能处理括号的匹配,这些都是怎么实现的呢? 一个大家熟知的答案是用栈,好的,那么为什么要用栈?为什么栈能实现呢? 目录 前言 ...
- linux安装python centos
下载安装包 可以到官网 ftp 地址,复制指定 python 版本源码安装包下载链接 https://www.python.org/ftp/python/ 或者到官网 downloads, 复制指定 ...
- 业余无线电爱好者,自制天线比较容易上手天线“莫克森天线”Moxon
本文仅作为笔记分享,如有疑问可以留言交流. 莫克森天线尺寸计算软件:Moxon rectangle 高手门做的成品,参考资料: 英文文献资料:
- Docker daemon error cannot allocate memory
Issue When getting theses errors: Jan 12 00:21:55 -- dockerd[904]: time="2018-01-12T00:21:55.32 ...
- javascript for...in
在JS中我们最常见的循环语句是for循环语句,一个简单的for循环语句如下: for(var i = 0, n = 100; i < n; i++){ // to do somethings . ...
- C#之集合常用扩展方法与Linq
一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...