首先需要介绍的是 C++ 本身的版本。由于 C++ 本身只是一门语言,而不同的编译器对 C++ 的实现方法各不一致,因此需要标准化来约束编译器的实现,使得 C++ 代码在不同的编译器下表现一致。C++ 自 1985 年诞生以来,一共由国际标准化组织(ISO)发布了 5 个正式的 C++ 标准,依次为 C++98、C++03、C++11(亦称 C++0x)、C++14(亦称 C++1y)、C++17(亦称 C++1z),最新的标准 C++20(亦称 C++2a)和 C++23(亦称 C++2b)仍在制定中。此外还有一些补充标准,例如 C++ TR1。
每一个版本的 C++ 标准不仅规定了 C++ 的语法、语言特性,还规定了一套 C++ 内置库的实现规范,这个库便是 C++ 标准库。C++ 标准库中包含大量常用代码的实现,如输入输出、基本数据结构、内存管理、多线程支持等。掌握 C++ 标准库是编写更现代的 C++ 代码必要的一步。
2、标准模板库(STL)STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法。由于其模板化的特点,它能够兼容自定义的数据类型,避免大量的造轮子工作。NOI 和 ICPC 赛事都支持 STL 库的使用,因此合理利用 STL 可以避免编写无用算法,并且充分利用编译器对模板库优化提高效率。
3、Boost库Boost 是除了标准库外,另一个久副盛名的开源 C++ 工具库,其代码具有可移植、高质量、高性能、高可靠性等特点。Boost 中的模块数量非常之大,功能全面,并且拥有完备的跨平台支持,因此被看作 C++ 的准标准库。C++ 标准中的不少特性也都来自于 Boost,如智能指针、元编程、日期和时间等。 Boost 中有不少轮子可以用来验证算法或者对拍,如 Boost.Geometry 有 R 树的实现,Boost.Graph 有图的相关算法,Boost.Intrusive 则提供了一套与 STL 容器用法相似的侵入式容器。有兴趣的读者可以自行在网络搜索教程。
具体请参考Boost官方网站,在比赛中是无法使用Boost库的,因此Boost库仅仅作为课外了解内容,课程内不再讨论。
二、STL容器的分类- 向量 (
vector
) 后端可高效增加元素的顺序表。 - 数组 (
array
) C++11 ,定长的顺序表,C 风格数组的简单包装。 - 双端队列 (
deque
) 双端都可高效增加元素的顺序表。 - 列表 (
list
) 可以沿双向遍历的链表。 - 单向列表 (
forward_list
) 只能沿一个方向遍历的链表。
- 集合 (
set
) 用以有序地存储 互异 元素的容器。其实现是由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种比较元素大小的谓词进行排列。 - 多重集合 (
multiset
) 用以有序地存储元素的容器。允许存在相等的元素。 - 映射 (
map
) 由 {键,值} 对组成的集合,以某种比较键大小关系的谓词进行排列。 - 多重映射 (
multimap
) 由 {键,值} 对组成的多重集合,亦即允许键有相等情况的映射。
- 无序(多重)集合 (
unordered_set
/unordered_multiset
) C++11 ,与set
/multiset
的区别在与元素无序,只关心”元素是否存在“,使用哈希实现。 - 无序(多重)映射 (
unordered_map
/unordered_multimap
) C++11 ,与map
/multimap
的区别在与键 (key) 无序,只关心 “键与值的对应关系”,使用哈希实现。
容器适配器其实并不是容器。它们不具有容器的某些特点(如:有迭代器、有 clear()
函数……)。
”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”,适配器对容器进行包装,使其表现出另外一种行为。
- 栈
(stack
) 后进先出 (LIFO) 的容器。 - 队列 (
queue
) 先进先出 (FIFO) 的容器。 - 优先队列 (
priority_queue
) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列。
都是 containerName name
的形式,但模板参数( 内的参数)的个数、形式会根据具体容器而变。
本质原因:STL 就是“标准模板库”,所以容器都是模板类。
迭代器具体关于迭代的内容总结请关注我的专栏-C++ STL 迭代器
共有函数=
:有赋值运算符以及复制构造函数。
begin()
:返回指向开头元素的迭代器。
end()
:返回指向末尾的下一个元素的迭代器。 end()
不指向某个元素,但它是末尾元素的后继。
size()
:返回容器内的元素个数。
max_size()
:返回容器 理论上 能存储的最大元素个数。依容器类型和所存储变量的类型而变。
empty()
:返回容器是否为空。
swap()
:交换两个容器。
clear()
:清空容器。
==
/ !=
/ /
=
:按 字典序 比较两个容器的大小。(比较元素大小时 map
的每个元素相当于 set
,无序容器不支持 /
=
。)