某些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 ...
随机推荐
- 这期没有 AI 开源项目「GitHub 热点速览」
最近 GitHub 上的 AI 开源项目扎堆,几乎到了"刷屏"的程度.所以这次我们换个口味,来看看那些非 AI.有趣的开源项目! Rust 不好学呀!尤其是所有权和生命周期这些概念 ...
- 运行中的Docker容器获取 .NET项目的Dump文件
进入容器的 shell docker exec -it 容器名称或 id /bin/bash 使用cd命令进入NETSDK所在文件夹 cd /usr/share/dotnet/shared/Micro ...
- hbase - [02] 分布式安装部署
一.角色规划 主机名 node01 node02 node03 node04 Zookeeper ○ ○ ○ NameNode ○ ○ JournalNode ○ ○ ○ DataNo ...
- 记录一段mysql代码
SELECT f . * , tmp.userid, tmp.cishu FROM fx_user f, ( SELECT a.id, b.userid AS userid, COUNT( * ) A ...
- 『Python底层原理』--异步机制(async/await)
在现代编程中,并发是提高程序效率的关键技术之一,它允许程序同时执行多个任务,充分利用系统资源. 本文将深入探讨 Python 中的async/await机制,从并发编程基础讲起,逐步剖析其工作原理和实 ...
- 【自编RSG插件】梁结构生成插件QGToolBox
正在学习基于ABAQUS-PYTHON的GUI开发,出于练手的想法,编写了一个简单的插件. 实现功能: 基于nodes. rods的table,完成桁架结构的几何建模. GUI界面: RSG Buil ...
- Linux系统挂载未分配硬盘空间
先查看未挂载之前的磁盘使用情况 发现磁盘使用率已经达到了96%,迫切需要扩容 查看分区情况fdisk –l 首先确保有可分配的磁盘空间 发现/dev/vda下有400多个G 的空间 所以将/dev/v ...
- Gentoo 使用 Obs进行屏幕分享
Obs-Studio 安装使用 on Hyprland 依赖安装 pipewire wireplumber xdg-desktop-portal-hyprland emerge -aq pipewir ...
- Redis 原理 - Sorted Set (ZSet)
Sorted Set (ZSet) 数据结构 Sorted Set (ZSet), 即有序集合, 底层使用 压缩列表(ziplist) 或者 跳跃表(skiplist) 使用 压缩列表(ziplist ...
- [每日算法 - 华为机试] leetcode20 :有效的括号 「栈」
入口 力扣https://leetcode.cn/problems/valid-parentheses/submissions/ 题目描述 给定一个只包括 '(',')','{','}','[','] ...