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为0vector<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的详细介绍在这篇博客
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