因网络上 STL 教程大多零散且缺乏严谨性,本文对算法竞赛所需 C++ Standard Library 做了一个较为全面的总结。

全文主要参考以下文档:

如有能力,阅读原文可获得更深入的了解。

1 STL 算法

均在 #include<algorithm> 定义。

  • std::sort(first,last,cmp)

    排序为不降序列。

    接受随机访问迭代器。可自定义比较函数。

    平均时间复杂度 O(nlog⁡n),C++11 后严格 O(nlog⁡n)。

  • std::stable_sort(first,last,cmp)

    排序为不降序列,且保持相等元素的顺序。

  • std::lower_bound(first,last,val,cmp)

    返回指向首个不小于 val 的元素的迭代器,如无,返回 last

    要求小于 val 的值和大于等于 val 的值分居区间两侧。

    可自定义比较函数。若迭代器支持随机访问,对数时间复杂度,否则为线性。

  • std::upper_bound(first,last,val,cmp)

    返回指向首个大于 val 的元素的迭代器,如无,返回 last

  • std::unique(first,last,cmp)

    保留区间中所有连续等值区间的首个元素组成新序列,返回处理后序列的尾迭代器。

    接受前向迭代器,可自定义判断相等的函数。

    线性时间复杂度。

2 基本或特殊容器

注:C++11 新引入的容器,大部分头文件名与容器名一致。

  • pair #include<utility> :元素对。
  • tuple (C++11) :元组。
  • bitset #include<bitset> :定长压缩 01 串,可在 O(NK) 的时空复杂度内完成常见运算,K 对应操作系统位数。
  • string #include<string> :字符串。

2.1 pair

  • operator= :重载了赋值运算符用于拷贝。
  • first / second :访问第一项或第二项。
  • std::make_pair(a,b) :新建元素对,自动检测类型。
  • operator<=> :重载了各种比较运算符,按第一关键字、第二关键字顺序比较。

2.2 tuple

  • operator= :重载了赋值运算符用于拷贝。
  • std::get<i>(tp) :获取元组的第 i 项。
  • std::get<T>(tp) :获取元组中类型为 T 的项。
  • std::make_tuple(a,b,c,...):新建元组,自动检测类型。
  • operator<=> :重载比较运算符,同样是顺序关键字比较。 …

2.3 string

vector 类似。其余重要特性如下:

  • c_str() :生成一个 C 风格字符串(尾部置 0)并返回其头部指针。
  • length()size() 的同义函数。
  • append(str) :后方追加字符串,返回 *this
  • append(first, last) :区间插入版本。
  • operator+ :连接两个字符串。
  • compare(str) :字典序比较。返回一个 int,用 <0 / ==0 / >0 判断该字符串小于 / 等于 / 大于参数字符串。
  • operator<=> :字典序比较的运算符重载。
  • substr(pos=0, count):返回 [pos, min(pos+count, size())) 的子串。时间复杂度与 count 成线性。
  • pop_back() (C++11)
  • find(str) / rfind(str) / find_first_of(c) / find_first_not_of(c) / find_last_of(c) / find_last_not_of(c):找字符串或字符,返回位置。若无,返回 npos=-1无时间复杂度保证,不建议使用。

2.4 bitset

bitset<N> bs(val / str):声明一个长度为 N 的 bitset 并设定初值。

  • & / ! / ^ / ~ / >> / << :支持 AND / OR / XOR / NOT / 右移 / 左移等位运算系列。
  • operator== :判断两个 bitset 是否相同。
  • test(idx) / operator[idx] :前者会做越界检查,抛出异常。
  • size()
  • count() :返回 1 的个数。
  • all() (C++11) :检查是否全为 1。
  • any() / none() :检查是否存在 1 / 没有 1。
  • set() / reset() :所有位赋 1 / 0。
  • flip() :翻转 0 / 1。

3 STL 容器概览

以下部分均为 STL 容器相关内容。

3.1 迭代器

声明:形如 vector<int>::iterator iter = xxx.begin()。C++11 后可用 auto 代替类型声明。

*iter 取值,iter++ 后继。

双向迭代器可 iter--,随机访问迭代器支持加减、比较运算。

  • begin(), end() :返回迭代器。end() 常作为 NULL 使用。
  • cbegin(), cend() (C++11) :部分容器支持,返回只读迭代器。
  • rbegin(), rend() :部分容器支持,返回反向迭代器。
  • crbegin(), crend() :部分容器支持,返回只读反向迭代器。

3.2 公共性质

  • operator= :重载了赋值运算符用于拷贝。
  • empty() :返回容器是否为空,即 v.begin() == v.end()
  • size() :返回容器内元素个数。
  • clear() :清空容器。

4 序列式容器或容器适配器

序列式容器:

  • array (C++11) :定长顺序表,常数随机访问。
  • vector #include<vector>:顺序表,常数后段插入,常数随机访问。
  • deque #include<deque> :顺序表,常数双端插入,常数随机访问
  • list #include<list> :链表,常数插入删除,双向迭代器。
    • forward_list (C++11) :单向版本。

容器适配器(均不支持迭代器):

  • queue #include<queue>:队列(FIFO)。适配双向变长序列式容器,即 deque(默认)或 list
  • stack #include<stack>:栈(LIFO)。适配变长序列式容器,即 deque(默认)、vectorlist
  • priority_queue #include<queue>:大根堆。适配随机访问变长序列式容器,即 vector(默认)或 deque

4.1 vector

Find:

  • crbegin()
  • at(idx) / operator[idx] :前者会做越界检查,抛出异常。
  • front(), back() :返回首尾元素引用。

Modify:

  • push_back(x) / pop_back() :均摊常数复杂度。
  • insert(iter, val) :于迭代器 iter 处插入,返回指向被插入元素的迭代器。 insert(iter, first, last) :左闭右开区间插入,返回指向首个被插入元素的迭代器。 注意,此操作非常数时间复杂度
  • erase(iter) :于迭代器 iter 处删除,返回指向被删除元素的后一个元素的迭代器。 erase(first, last) :左闭右开区间删除,返回指向被删除元素的后一个元素的迭代器。 注意,此操作非常数时间复杂度

Size:

  • resize(n) :改变长度,可指定补充元素默认值。
  • shrink_to_fit() :调整为恰好长度。

vector<bool> 被特殊定义,使用方式较为复杂,不建议使用

4.2 deque

  • push_front(x), pop_front()

其余与 vector 类似。

stack

  • top()
  • push(x)
  • pop()

queue

  • front()
  • push(x)
  • pop()

priority_queue

std::priority_queue<TypeName, Container, Compare>:类型名,底层容器,比较类型。

大根堆,默认用 < 比较大小,即 Compare 传入 std::less<T>。亦可选择传入 std::greater<T> 使用 > 作为比较符号,进而构造出小根堆。

函数同 queue,但 push() / pop() 为对数时间复杂度。

参照 std::less<T> 的实现,自定义比较方式,需传入一个重载了 operator() 的结构体。

4.3 list

  • 无随机访问接口。
  • insert(iter, val) / erase(iter) :插入与删除变为常数时间复杂度,参见 vector
  • sort(cmp) :为链表特殊设计的 O(nlog⁡n) 稳定排序算法。

其余与 deque 类似。

5 关联式容器

不支持随机访问,双向迭代器,大部分操作为对数时间复杂度,红黑树实现。

  • set / multiset #include<set>:元素有序。后者支持同值多元素。
  • map / multimap #include<map>:键有序。后者支持同键值多元素。

5.1 set / multiset

set<Key, Compare>:类似 priority_queue,可自定义比较方式。

Find:

  • crbegin()
  • count(x) :返回值为 x 的元素数量。
  • lower_bound(x) / upper_bound(x) :为 set 特殊定制的对数时间复杂度 lower_boundupper_bound

没有 nth_element(),对数时间复杂度查询第 k 大需手写或使用 pbds 库。

Modify:

  • insert(x) :插入元素 x。返回 pair<iterator, bool>,表示插入元素的迭代器与插入是否成功。 对于 multiset,由于插入不会失败,insert 只返回迭代器。
  • erase(x) :删除所有值为 x 的元素,返回删除元素的个数。 erase(iter) :删除迭代器指向的元素,(C++11) 返回指向被删除元素的后一个元素的迭代器。 erase(first, last):左闭右开区间删除,(C++11) 返回指向被删除元素的后一个元素的迭代器。

删除单个值为 x 的元素,可按如下方法进行:

auto it = s.find(x);
s.erase(it);

5.2 map / multimap

map<Key, T, Compare>:可自定义比较方式。

  • 对迭代器解引用得到 pair<Key, T>
  • insert(pair<Key, T>)
  • at[key] / operator[key]:前者会做越界检查,抛出异常。

其余与 set 类似。

6 无序关联式容器 (C++11)

单向迭代器,平均常数时间复杂度,Hash 实现。

若不支持 c++11,使用时需引入 TR1 扩展。例如,使用 unordered_map 需引入 #include<tr1/unordered_map> 头文件,使用时需写为 std::tr1::unordered_map

  • unordered_set / unordered_multiset #include<unordered_set>:元素无序。
  • unorderep_map / unordered_multimap #include<unordered_map>:键无序。

只有单向迭代器,其余特性与有序版本类似。

此外,可按如下方法自定义相等判定方式和 Hash 函数。

  • unordered_set<Key, Hash, KeyEqual>
  • unordered_map<Key, T, Hash, KeyEqual>

如上,可自定义 Hash 函数。

算法竞赛向 C++ Standard Library 使用速查的更多相关文章

  1. C++学习书籍推荐《The C++ Standard Library 2nd》下载

    百度云及其他网盘下载地址:点我 编辑推荐 经典C++教程十年新版再现,众多C++高手和读者好评如潮 畅销全球.经久不衰的C++ STL鸿篇巨著 C++程序员案头必 备的STL参考手册 全面涵盖C++1 ...

  2. C++ Standard Library

    C++ Standard Library *注:内容主要是对參考1的学习记录.知识点与图片大都来源于该书, 部分知识点与图片来源于參考2. 详细參考信息,见最下方參考. * C++98中新支持的语言特 ...

  3. Python Standard Library

    Python Standard Library "We'd like to pretend that 'Fredrik' is a role, but even hundreds of vo ...

  4. [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II

    [译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...

  5. [译]The Python Tutorial#10. Brief Tour of the Standard Library

    [译]The Python Tutorial#Brief Tour of the Standard Library 10.1 Operating System Interface os模块为与操作系统 ...

  6. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  7. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  8. Python语言中对于json数据的编解码——Usage of json a Python standard library

    一.概述 1.1 关于JSON数据格式 JSON (JavaScript Object Notation), specified by RFC 7159 (which obsoletes RFC 46 ...

  9. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  10. python 下的数据结构与算法---2:大O符号与常用算法和数据结构的复杂度速查表

    目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记 ...

随机推荐

  1. 39.BasicAuthentication认证

    BasicAuthentication认证介绍 BasicAuthentication使用HTTP基本的认证机制 通过用户名/密码的方式验证,通常用于测试工作,尽量不要线上使用 用户名和密码必须在HT ...

  2. 二十九、Helm常用命令

    # 创建一个chart范例 helm create HELM-NAME # 检查chart语法 helm lint ./HELM-NAME # 使用默认chart部署到k8s helm install ...

  3. vim编译器

    光标移动,模式切换,删除,查找,复制,粘贴,撤销 vim的三种模式(重点) vim存在的三种模式 命令模式,编辑模式,尾行模式 命令 模式:不能直接编辑.但是可以用快捷键进行一些操作(删除,复制,移动 ...

  4. linux下搭建oh-my-zsh环境

    目标:因为用习惯了zsh的shell环境,所以习惯在服务器上也搭建zsh环境,但是每次搭建都需要Google每一步骤,感觉很麻烦,所以决定记录一下,免得一次次查 1. 安装zsh zsh是一款shel ...

  5. Vue2基础知识学习

    Vue2基础知识学习 01.初识 new Vue({ el: '#root', //用于指定当前Vue实例为哪个容器服务,值通常为css选择器符 data () { return { } } }); ...

  6. CentOS 8 离线安装 podman 解决方法

    CentOS 8 系统中如果没有安装Podman的话,想要离线安装会比较麻烦,因为podman依赖的包比较多,从网上一个一个下载会很繁琐,也容易出错. 这里介绍一种曲线救国的方式来离线安装. 首先分享 ...

  7. 【iOS逆向与安全】frida-trace入门

    前言 frida-trace是一个用于动态跟踪函数调用的工具.支持android和ios.安装教程请参考官网.工欲善其事必先利其器.本文将以某App为示范,演示frida-trace的各种方法在iOS ...

  8. WINDOWS下对NIGNX日志文件进行限制

    首先接到这个任务,发现nginx的日志限制更多的都是在Linux下做的,找了半天,也没找到能直接通过nginx.conf更改体现到日志限制上的. 最后决定直接通过bat脚本,来对nginx的日志进行分 ...

  9. 2.6:Python数据存取-文件、文件夹及目录、数据库

    一.Python文件读写 1.文件的打开模式 <class '_io.TextIOWrapper'>和<class '_io.BufferedReader'>.python使用 ...

  10. 【大数据面试】【项目开发经验】Hadoop、Flume、Kafka、Hive、MySQL、Sqoop、Azkaban、Spark

    主要内容:框架层面的调优.业务经验 一.Hadoop 1.Hadoop基准测试(HDFS的读写性能.MapReduce的计算能力测试) (1)测试内容:文件上传下载的时间 (2)服务器有几个硬盘插槽 ...