标签: C++标准库 - STEMHA's Blog

STL 算法整理

标准库中常见的函数与头文件

STL 堆常用操作

基本概念

  • STL中并没有把heap作为一种容器组件,heap的实现亦需要更低一层的容器组件(诸如list,array,vector)作为其底层机制。

  • Heap是一个类属算法,包含在< algorithm >中。

  • STL中关于heap默认调整成的是大顶堆,可以用自定义的compare_fuction函数实现大顶堆或小顶堆。

  • heap的低层机制vector本身就是一个类模板,heap基于vector便实现了对各种数据类型(无论基本数据类型还是用户自定义的数据类型)的堆排(前提是用户自定义的数据类型要提供比较机制compare_fuction函数)。

string常用操作

基本概念

标准库 string 类型:string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。
可以使用输入输出流方式直接进行操作,也可以通过文件等手段进行操作。
size_type是一个依赖于实现的整型,是在string中定义的。
string类将string::npos定义为字符串的最大长度,通常为unsigned int的最大值。
另外,使用缩写NBTS(null-terminated string)来表示以空字符结束的字符串。

deque常用操作

概念

Deque(双向队列)

  • 和Queue差不多 ,但是特殊的是Deque可是扩充内存。(实际上连续内存的容器不能随意扩充,所以Deque也不是真正意义上的扩充内存,而是封装了底层的表象。
  • Deque是由一段段构成的,当走到尾端时自动跳到下一段,(支持迭代器++操作)。
  • 每次扩充,就会申请一个段,从而实现了内存连续的假象。

默认的stack 和 queue 都基于 deque 容器实现, priority_queue 则基于 vector 容器实现。
对于给定的适配器,其关联的容器必须满足一定的约束条件。

  • stack 适配器所关联的基础容器可以是任意一种顺序容器类型。因此,stack 栈可以建立在vector、list 或者 deque 容器之上。
  • queue 适配器要求其关联的基础容器必须提供 push_front 运算,因此只能建立在 list 或deque容器上,而不能建立在vector 容器上。
  • priority_queue 适配器要求提供随机访问功能,因此可建立在vector 或 deque 容器上,但不能建立在 list 容器上。

STL排序相关库

sort

函数声明

1
2
3
4
5
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

list常用操作

基本概念

list

  • 底层数据结构为双向链表,支持快速增删
  • 缺点是无法通过位置来直接访问序列中的元素,也就是说,不能索引元素。为了访问 list 内部的一个元素,必须一个一个地遍历元素,通常从第一个元素或最后一个元素开始遍历。
  • 节点对象维护了两个指针,一个指向前一个节点,另一个指向下一个节点。
  • 第一个元素的前向指针总是为 null,因为它前面没有元素,尾部元素的后向指针也总为 null。

map常用操作

基本概念

map

  • map不能直接修改关键字,只能通过修改关键字的值间接修改关键字。
  • 底层数据结构为红黑树,有序,不重复
  • map<K,T> 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。

pair常用操作

基本概念

pair

  • pair 是一个比较简单的模板类型,它只有两个 public 数据成员 first 和 second。
  • pair 对象可以封装任意类型的对象,可以生成任何想生成的 pair<T1,T2> 对象,可以是数组对象或者包含 pair<T1,T2> 的 vector 容器。例如,pair 可以封装两个序列容器或两个序列容器的指针。pair<T1,T2> 模板定义在 utility 头文件中,如果不想使用 map 而只想使用 pair 对象,可以包含这个头文件。

头文件

1
2
3
# include<utility>
或者
# include<map>

set常用操作

基本概念

set是一个关联容器类型,用于以升序方式存储唯一值。

  • 属于关联容器(关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。)

priority_queue常用操作

概念

priority_queue容器适配器定义了一个元素有序排列的队列。

  • 默认队列头部的元素优先级最高。
    • 因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理。
  • 如何定义“优先级”完全取决于我们自己。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×