c++ STL详解

本文详细介绍了C++标准库中的各种容器,包括Sequence Containers、Container Adaptors和Associative Containers等,涵盖了vector、list、deque、stack、queue、set、multiset、map、unordered_set、unordered_map等数据结构的创建、操作及应用场景。

1、Sequence Containers:维持顺序的容器

(a)、vetor 

(1)创建一维vector

vector<int> nums;//不指定长度
vector<int> nums(n); //指定长度为n

添加元素

nums.push_back(1);//直接从数组末端添加
nums[i]=1;//直接赋值给第i个位置

删除元素

nums.resize(nums.size-1)
nums.pop_back()

获得长度:nums.size()

排序(O(nlogn)):sort(nums,begin(),nums.end());

翻转:reverse(nums.begin(),nums.end());

合并两个vector:合并nums1和nums2,并将合并后的数组赋值给nums

vector<int> nums1(m),nums2(n);
vector<int> nums;
nums.resize(m+n);
merge(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),nums)

(2)创建m*n的二维vector:直接定义

vector<vector<int>> nums(m,vector<int>(n));  //m*n的二维vector

定义了一个vector容器,元素类型为vector,初始化包含了m个vector对象,每个对象都是一个新创立的vector对象的拷贝,而这个新创立的vector对象被初始化为包含n个0。

vector(n)表示够早了一个无名且含n个0的vector对象。

动态创建m*n的二维vector

方法1:

vector<vector<int>> nums;
nums.resize(m);
for(int i=0;i<m;i++) nums[i].resize(n);

方法2:

vector<vector<int>> nums;
nums.resize(m,vector<int>(n));

初始化二维数组

vector<vector<int>> nums=vector(m,vector<int>(n,0));   
//m*n的二维vector,所有元素为0

(b)、list:双向链表。

也可以当做stack和queue使用,用在经典的LRU问题中,需用利用链表的特性来解决。

(c)、deque:双端队列

非常强大的数据结构,既支持O(1)随机读取,又支持O(1)时间的头部增删和尾部增删,不过有一定的额外开销。

(d)、array和forward_list:固定大小的数组和单向链表

2、Container Adaptors:基于其他容器实现的数据结构

(a)、stack:后入先出的数据结构,默认基于deque实现。常用语深度优先搜索、字符串匹配问题和单调栈问题。

(b)、queue:先入先出的数据结构,基于deque实现。deque常用于广度优先搜索。

(c)、priority_queue:最大值先出的数据结构,基于vector实现堆结构。可以在O(nlogn)的时间排序数组,O(logn)的时间插入任意值。

3、Associative Containers:实现了较好的数据结构

(a)、set:有序集合,元素不可重复,底层默认为红黑树,即一种特殊的二叉查找树(BST)。它可以在O(nlogn)的时间排序数组,O(logn)的时间插入、删除、查找任意值,O(logn)的时间获得最小或最大值。但是它们的时间复杂度和功能略有区别,如priority_queue默认不支持删除任意值,而set获得最大或最小值的时间复杂度略高。

(b)、multiset:支持重复元素的set。

(c)、有序映射或有序表。在set的基础上加上映射关系,可以对每个元素可以存一个值value。

4、unordered Associative Containers:对每个Associative Containers实现了哈希版本

(a)unordered_set:哈希集合,可以在O(1)的时间快速插入、查找、删除元素,常用于快速的查询一个元素是否在这个容器内。

(b)unordered_multiset:支持重复元素的unordered_set。

(c)unordered_map:哈希映射或哈希表。

(d)unordered_multimap:支持重复元素的unordered_map。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值