STL大法好!

stable_sort

基于归并排序,时间复杂度稳定同时并不会改变相对顺序,平替sort,用法一模一样。(可以过一些甚至卡sort的毒瘤,但是由于sort是均摊复杂度 \(O(nlogn)\),因此sort在某些题中会快一点,如SA)

bitset

按照 Oi Wiki 的说法,bitset严格上来说并不是STL,但是其应用非常的广泛,运用在各类复杂度错误但不多的题中去优化常数,一般而言可以优化32倍然后就可以卡过了

  1. 定义:bitset<1000> bs; 这里的1000指的是其位数,大概可以理解为你开了1000个bool变量,只是比存储空间及时间比bool小得多。
  2. 初始化:对于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);
  1. 操作位:
b.set(); // 将所有位设置为1
b.set(loc);//将某一位改为1
b.reset(); // 将所有位设置为0
b.reset(loc);//将某一位改为0
b.flip(); // 翻转所有位的值
b.flip(loc);//翻转某一位
  1. 访问位:

    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

由于 mapunordered_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用法的更多相关文章

  1. 算法拾遗[4]——STL用法

    主要bb一下优先队列和字符串吧. 哦还有 bitset. 优先队列 定义很容易: priority_queue<int> pq; 内部是一个堆. 基本操作 pq.top() 取堆顶元素; ...

  2. STL&&用法集合

    .....STL是c++里很强势很好用的一系列容器(函数)之类的,之前一直不太会用,所以总是暴毙....想着快比赛了,是时候理一下这些东西了. -1.pair 存放两个基本元素的东西 定义方法: pa ...

  3. STL用法之set

    [C++::STL]之set的用法 c++ set求差集,并集,交集

  4. STL用法总结

    stringstream用法:对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为. stream << i   将i输入流中 stream >> ...

  5. STL用法整理

    百度百科 STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称.从根本上说,STL是一些“容器”的集合,这些“容器”有list,vect ...

  6. STL用法大全

    1.    概述 泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断.20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL.但直 ...

  7. [笔记]一些STL用法

    参考资料:STL 在 OI 中的应用 离散化 std::unique 功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复出现的元素依次排在后面 返回值:返回迭代器,迭代器指向的是重复元 ...

  8. 转:栈和队列小知识【STL用法】

    原文出处:http://blog.csdn.net/chenzhenyu123456/article/details/44519943 栈: (一)头文件  #include<stack> ...

  9. STL用法

    map.find(key) 获取map容器中指定键值x的元素,如果找到,返回此元素的迭代器,否则返回map::end()的迭代器(即查找到容器的末尾都没有找到此元素).

  10. C++ STL用法总结(持续更新)

    Vector 动态数组 https://www.cnblogs.com/zhonghuasong/p/5975979.html lower_bound&&upper_bound htt ...

随机推荐

  1. [SDOI2008] 洞穴勘测 题解

    似乎所有的线段树分治题都能被 \(LCT\) 平替掉? 一眼动态树,直接 \(LCT\). Connect x y 操作用 \(link(x,y)\) 实现,Destroy x y 操作用 \(cut ...

  2. 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程

    线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...

  3. csharp入门经典

    C#简介 .NET Framework是Microsoft为开发应用程序而创建的一个具有革命意义的平台,它有运行在其他操作系统上的版本 .NET Framework的设计方式确保它可以用于各种语言,包 ...

  4. 前端UI框架Ant Design Pro

    https://012x.ant.design/ 一直忙于工作,也没时间总结.现在有点零散时间把之前做的笔记整理一下. 目前项目使用的技术栈是,前端UI框架Ant Design Pro,数据交互使用r ...

  5. oauth2.0 判断接口是否允许跨域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 对接服务升级后仅支持tls1.2,jdk1.7默认使用tls1.0,导致调用失败

    背景 如标题所说,我手里维护了一个重要的老项目,使用jdk1.7,里面对接了很多个第三方服务,协议多种多样,其中涉及http/https的,调用方式也是五花八门,比如:commons-httpclie ...

  7. 修改npm下载地址为淘宝镜像

    修改 npm 下载地址 修改为国内淘宝镜像 # 修改为新淘宝镜像(推荐) npm config set registry https://registry.npmmirror.com/ # 旧 npm ...

  8. 通过 API 将Deepseek响应流式内容输出到前端

    要实现通过 API 将流式内容输出到前端,可以采用以下技术方案(以 Python 后端 + 前端 JavaScript 为例): 方案一:使用 Server-Sent Events (SSE) 这是浏 ...

  9. Kubernetes 编译 kubeadm 修改证书有效期到 100 年

    前言 kubeadm 生成的客户端证书在 1 年后到期.过期后,会导致服务不可用,使用过程中会出现:x509: certificate has expired or is not yet valid. ...

  10. css px em rem % vw vh vm 区别

    前言 在传统项目开发中,我们只会用到 px.%.em 这几个单位长度,它们可以适用大部分项目的开发,并且拥有较好的兼容性. 而从 css3 开始,浏览器对逻辑单位的支持又提升了新的境界,增加了 rem ...