STL总结

C++常用容器API整理

Posted by pfan8 on July 24, 2019

STL的概念

前言

在C语言中,只有一种容器,数组Array,这样单一的数据结构是完全不够的。问题不在于动态数组的问题,而是我们需要更多功能的数据结构,比如列表,堆,栈,树等,

当然,可以在序数阵列中实现此功能。但是这样的实现效率非常低。你可以创建一个hash树来以更快的方式解决它,但是想一想:这样一个容器的实现是否依赖于我们要存储的元素?我们是否必须重新实现模块才能使其正常运行,例如,平面上的点而不是字符串?

如果没有,我们可以为这样的容器开发一次接​​口,然后随处使用任何类型的数据。简而言之,这就是STL的思想。

定义

标准模板库(STL)是一组C ++模板类,用于提供通用编程数据结构和函数,如列表,堆栈,数组等。它是容器类,算法和迭代器的库。它是一个通用库,因此,它的组件是参数化的。模板类的工作知识是使用STL的先决条件。

STL包含4部分

详细介绍在这里,这里就不一一列出。另外本文着重罗列容器的部分

  • 算法
  • 容器
  • 函数
  • 迭代器

命名空间

大部分容器的头文件名就是容器的名称,例如

#include <stack>

但也有些命名空间在std,因此最好用上

using namespace std;

vector

vector是最常用的数组容器,并且可以动态增删,索引访问,类似于Java的ArrayList

初始化

  • vector<int> v;,直接初始化,v为空,size为0
  • vector<int> v = {1,2,3.0,4,5,6,7};
  • vector<int> v(v2);,初始化v,作为v2的拷贝
  • vector<int> v(v2.begin()+2, v2.end()-1);,设置v2的拷贝范围
  • vector<int> v(N),N代表初始化数组大小
  • vector<int> v(N,V),N代表初始化数组大小,V代表初始化的值,例如
int N, M;
// ...
vector< vector< int > > Matrix(N, vector< int >(M, -1));
初始化了N*M的矩阵,并且赋值为-1

常用API

  • Iterator
    • begin()
    • end()
  • push_back()
  • pop_back()
  • size()
  • empty()
  • clear()
  • erase()
  • insert() 等等,更多点击链接查看

String

string是c++封装的字符串类,因为c语言的str风格太难用,所以string的目的就是为了方便使用 例如可以使用Java String风格的s += 'blabla',可以用c_str()接口转换成C语言的char数组,末尾是'\0',更多string的详细介绍在这篇博客

关于String的赋值与修改

Set/Map

关于Set和Map,给出如下列表(原文):

Associative Containers : implement sorted data structures that can be quickly searched (O(log n) complexity).

  • set
  • multiset
  • map
  • multimap

Unordered Associative Containers : implement unordered data structures that can be quickly searched

  • unordered_set (Introduced in C++11)
  • unordered_multiset (Introduced in C++11)
  • unordered_map (Introduced in C++11)
  • unordered_multimap (Introduced in C++11)

可以看出,unordered_xx是hash函数查找key的,因此是O(1)复杂度,而普通的xx是二叉树(记得是BST)查找key,因此是O(logn)复杂度,使用时应当根据需求选择容器

补充说明一点,MultiSet是指可以存在多个重复元素的set,需要注意的是MultiSet插入的时候,如果是相同的元素,插入的位置似乎是随机的,是有可能添加在当前元素的末尾(做LeetCode求中位数的题时遇到这个问题)

常用API

  • begin()
  • end()
  • insert()
  • erase()
  • clear()
  • size()
  • empty()
  • find()
  • lower_bound()
  • upper_bound()

Stack/Queue

栈FILO,队列FIFO,用得比较多了,也是基本DS,这里就列出几个API Stack:

  • push()
  • pop()
  • top()
  • size()
  • empty()

Queue:

  • push()
  • pop()
  • front()
  • size()
  • empty()

更多

个人更多算法总结在Github