C++STL标准模板库

一、标准容器 C++11 array forward_list

1.顺序容器

vector deque list

vector向量容器

底层数据结构:动态开辟的数组,每次以原来空间大小的2倍进行扩容

vector<int>vec;

增加:

vec.push_back(20);末尾添加元素O(1),可能会导致扩容

容器中,对象的构造析构,内存的开辟释放,是通过容器的空间配置器allocator实现的

容器空间配置器有四个参数(allocate deallocate construct destroy)

vec.insert(it,20);it迭代器指向的位置田间一个元素20 O(n)

当我们进行元素插入时,后面元素需要挪动

删除

vec.pop_back(); 删除尾部元素O(1)

vec.erase(it);删除it迭代器指向的元素 O(n)

查询

operator[] 下标的随机访问 O(1)

iterator迭代器进行遍历

find,for_each

foreach => 通过iterator来实现的

注意:对容器进行连续插入或删除操作时(insert/erase),一定要更新迭代器,否则第一次insert或者erase完成,迭代器就失效了

常用方法介绍

size()

empty()

reserve(20):vector预留空间的

resize(20):容器扩容使用的

swap:两个容器进行元素交换

deque:双端队列容器

底层数据结构:动态开辟的二维数组,一维数组从2开始,以二倍的方式进行扩容,每次扩容之后,每次扩容之后,原来第二维的数组,从新的第一维数组的下标oldsize/2开始存放,上下都预留相同的空行,方便支持deque的首元素添加

first和last在中间而不是在首尾的原因是?

使得双端都可以进行扩容,预留首位空间

当首尾空间不足时,如何进行扩容?

先在mapper另一个空间中去扩容,如果一维空间不足时,以的MAP_SIZE大小进行扩容,然后调整二维空间和一维空间的对应位置(将原来的数据放到一维中间,可以方便前后元素的添加)

deque<int>deq;

增加

deq.push_back(20);从末尾添加元素 O(1)

deq.push_front(20);从首部添加元素O(1)

deq.insert(it,20);

删除

deq.pop_back();从末尾删除元素

deq.pop_front(20);

deq.erase(it);

查询搜索:同vector

注意:对容器进行连续插入或删除操作时(insert/erase),一定要更新迭代器,否则第一次insert或者erase完成,迭代器就失效了

2.容器适配器

(有一种设计模式就叫作适配器模式,但是容器适配器不能称之为适配器模式,应该说是代理模式)

stack queue priority_queue

如何理解容器适配器?

适配器底层没有自己的数据结构,它是另外一个容器的封装,他的方法全部由底层依赖的容器进行实现的;并且没有实现自己的迭代器

3.关联容器

set:集合 key map:映射表 [key,value]

无序关联容器 链式哈希表 增删查O(1)

unordered_set

unordered_multiset

unordered_map

unordered_multimap

有序关联容器 红黑树 增删查O(log2 n)2是底数(树的层数,树的高度)

set

multiset

map

multimap

二、近容器

数组 string bitset(位容器)

三、迭代器

iterator和const_iterator

reverse_iterator和const_reverse_iterator

四、函数对象(类似C的函数指针)

greater,less

函数对象也称之为仿函数

为什么不使用函数指针而创建出一个函数对象呢?

通过函数指针调用函数,是没有办法内联的(我的理解是:内联是发生在编译阶段的,模板中参数没被确定,函数指针此时无法确认要调用的函数),效率很低,有函数调用开销

五、泛型算法(C++11中大概70余种)=template+迭代器+函数对象

需要包含头文件<algorithm>

sort,find,find_if,binary_search,for_each

特点:

泛型算法的参数接收的都是迭代器;

泛型算法的参数还可以接收函数对象(C函数指针)

相关推荐
充满诗意的联盟6 分钟前
DDD该怎么去落地实现(4)多对多关系
java·开发语言
wyz092310 分钟前
python 之协程笔记
开发语言·笔记·python
快乐非自愿25 分钟前
Java中使用FFmpeg拉取RTSP流
java·开发语言·ffmpeg
武昌库里写JAVA41 分钟前
【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成
java·开发语言·spring boot·学习·课程设计
原来是猿1 小时前
蓝桥备赛(六)- C/C++输入输出
c语言·开发语言·c++
coderSong25681 小时前
【零基础C语言】第四节 数组
c语言·开发语言
蟹至之2 小时前
类和对象(6)——Object类、内部类
java·开发语言·接口·深拷贝与浅拷贝·内部类·object类
原来是猿2 小时前
蓝桥备赛(七)- 函数与递归(中)
开发语言·数据结构·c++·算法
柠石榴2 小时前
【练习】【栈】牛客NC212914牛牛与后缀表达式
c++·
m0_748257182 小时前
最新Java面试题,常见面试题及答案汇总
java·开发语言