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. Windows 提权-UAC 绕过

    本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...

  2. Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!

    Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来! 1. 优势介绍 Obsidian 是一款强大的本地知识管理软件,它像一个积木盒,让你用 Markdown 笔记 ...

  3. win7系统清理C盘空间方法实测

    问题描述:win7电脑C盘容易满,采用如下方法清理 方法一:win+r,输入%temp%查看临时文件,手动删除不需要的文件 方法二:减小休眠文件:如果你很少使用休眠模式,可以通过win+r输入cmd命 ...

  4. C#长短链接服务器端WebApi作映射

    [HttpGet] public IHttpActionResult GetLongLink(string code) { if (string.IsNullOrWhiteSpace(code)) { ...

  5. HarmonyOS SDK让小红书鸿蒙用户尽享原生相机的拍摄之美

    小红书是深受年轻人喜爱的生活社交类社区平台,越来越多的人在小红书上分享旅行.日常.心情.近日,不少使用鸿蒙原生版小红书的细心用户已经发现,直接使用小红书拍摄照片与自己使用原相机拍摄有一样清晰美观的呈现 ...

  6. 错误修正记录: [Vivado 12-8300] Launch HLS failed! Please see vitis_hls.log for details.

    起因 使用了Vivado Video Frame Buffer Read和Vivado Video Frame Buffer Write,按out of context模式综合失败.vivado版本2 ...

  7. nuxt,从开发到线上部署

    起因: 前段时间,同组小伙伴使用vue做了一个小后台,使一位后端沉寂多年得求道之心又躁动了起来...然后,当我和这个躁动起来得后端要合作重构一个网站得时候,后端小哥哥说,就知道套页面,套页面,不用新技 ...

  8. 【WPF开发】 direct3d11 调试报错

    环境:VS2022 WPF Win11 过程:准备调试d3d11着色器转换nv12->rgb的过程 报错信息:DXGI_ERROR_SDK_COMPONENT_MISSING 应用程序请求的操作 ...

  9. Redis 持久化机制简介【Redis 系列之三】

    〇.前言 Redis 持久化主要有两种:RDB(数据快照模式).AOF(追加模式),另外就是这两种模式的混合模式用. 本文将对这三种情况进行详细介绍. 博主 Redis 相关文章都在这里了:https ...

  10. g2o优化库实现曲线拟合

    g2o优化库实现曲线拟合 最近学习了一下g2o优化库的基本使用,尝试着自己写了一个曲线拟合的函数,也就是下面这个多项式函数: \[y = ax^3 + bx^2 + cx + d \] 我们以 \(a ...