目录

一、什么是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 常用于深度优先搜索,一些字符串匹配问题和单调栈问题。

stl容器中的map容器_算法

头文件:#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