目录
一、什么是STL
二、Sequence Containers(维持顺序的容器)
①vector(动态数组)
②list(双向链表)
二、Container Adaptors(基于其他容器实现的数据结构)
①stack(栈)
②queue(队列)
三、Associative Containers(实现了排好序的数据结构)
①set有序集合
②multiset
③map
④multimap
四、Unordered Associative Containers:对每个 Associative Containers 实现了哈希版本。
①unordered_set:哈希集合
②unordered_multiset
③unordered_map:哈希映射或我哈希表
④unordered_multimap
一、什么是STL
从根本上说,STL是一些“容器”的集合,并且也有一些其他内容,比如:向量(vector)、栈(stack)、队列(queue)、优先队列(priority_queue)、链表(list)、集合(set)、映射(map)等容器;min、max、swap、sort、lower_bound、upper_bound 等算法。
总之,STL是提高C++编写效率的一个利器。
在本文中重点介绍Sequence Containers,Container Adaptors,Associative Containers,Unordered Associative Containers. 其中重点介绍前两个部分,后两个部分简单提一下。
二、Sequence Containers(维持顺序的容器)
①vector(动态数组)
任意位置vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行,是我们最常使用 的数据结构之一。
头文件:#include<vector>
创建和初始化:在创建和初始化的时,要考虑数据类型、数据的个数以及数据的值。
vector<int> //空的整型vector
vector<float> vec2(3) //一个有3个元素的vector,初始值为编译器默认
vector<char> vec3(3,'a') //含有3个a的字符vector
vector<char> vec4(vec3) //拷贝了vec3
vector<int> a({1,2,3,4,5}) //对数组的初始化
关于迭代器:相当于STL容器的指针,可以用“*"来解除引用。
一个保存int的vector的迭代器声明方法:vector<int>::iterator it
添加 / 插入元素:在尾部进行
a.push_back(6) //尾部插入数字6
a.pop_back() //删除最后一个元素
使用下标访问元素:
a[i]
遍历:for+auto比较快
void text()
{
vector<int> a={1,2,3,4,5};
for(auto x : a)
{
cout<<x<<" ";
}
②list(双向链表)
由于链表不支持快速随机读取,因此我们很少用到这个数据结构,也有一个例外,是经典的LRU问题,需要用链表的特性解决。
#include<iostream>
#include<list>
using namespace std;
//构造方法
list<int> l1;
list<int> l2(5,3); //5个3
int main(){
//遍历
for(auto e : l1)
{
cout<<e<<endl;
}
}
二、Container Adaptors(基于其他容器实现的数据结构)
①stack(栈)
栈是基本的数据结构之一,特点是先进后出。就像一叠记录待办事项的便利贴,插入的便利贴只能放在这一清单的最上面;读取时也只能读取最上面的那一个,并将其扔掉。因此一般只要两种操作:压入(插入)和弹出(删除并读取)
stack 常用于深度优先搜索,一些字符串匹配问题和单调栈问题。
头文件:#include<stack>
常用操作:
#include<iostream>
#include<stack>
using namespace std;
int main(){
stack<int> q;
int x;
cin>>x;
q.push(x); //将x压入栈顶
q.top(); //读取栈顶的元素
q.pop(); //删除栈顶的元素
q.size(); //返回栈中元素的个数
q.empty(); //检查栈是否为空,若为空返回true,否则返回false
}
②queue(队列)
queue是一种先进先出的数据结构。顾名思义,它有两个出口,容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为。
队列中进数据称为入队(push),这就像一个通着的水管,入队像水随着水进推着向前。
queue 常用于广度优先搜索。
头文件:#include<queue>
构造与赋值:
queue<int> a; //构造
queue<const queue &a>; //拷贝构造函数
queue& operator=(const queue &que); //重载等号操作符
数据存取:
push(elem); //往队尾添加元素
pop(); //从队头移除第一个元素
back(); //返回最后一个元素
front(); //返回第一个元素
大小操作:
empty(); //判断堆栈是否为空
size(); //返回栈的大小
三、Associative Containers(实现了排好序的数据结构)
①set有序集合
有序集合,元素不可重复,底层实现默认为红黑树,即一种特殊的二叉查找树(BST)。已可以在O(nlog n) 的时间排序数组,Ologn) 的时问插入、删除、查找任意值,O(ogn) 的时间获得最小或最大值。这里注意,set 和 priority _queue 都可以用于维护数据结构并快速获取最大最小值,但是它们的时间复杂度和功能略有区别,priority_queue 默认 不支持删除任意值,而 set获得最大或最小值的时间复杂度略高,具体使用哪个根据需求而定。
②multiset
支持重复元素的 set。
③map
有序映射或有序表,在set的基础上加上映射关系,可以对每个元素key存一个值value。
④multimap
支持重复元素的map。
四、Unordered Associative Containers:
对每个 Associative Containers 实现了哈希版本。
①unordered_set:哈希集合
可以在 O(1)的时间快速插人、查找、删除元素,常用于快 速的查询一个元素是否在这这个容器内。
②unordered_multiset
支持重复元素的 unordered_set。
③unordered_map:哈希映射或我哈希表
在 unordered_set 的基础上加上映射关系,可以对每一个元素 key 存一个值 value。在某些情况下,如果key 的范围已知且较小,我们也可以用 vector 代替 unordere d_map,用位置表示 key,用每个位置的值表示 value。
④unordered_multimap
支持重重复元素的unordered_map