C++:STL(标准模板库)

STL:主要是一些"容器"的集合;"容器"有:vector(数组)、list(双向链表)、deque(双向队列)、set(集合)、map(图:内部结构红黑树)

STL也是算法和其他一些组件的集合,是泛型编程的一个经典范例。

STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。

STL六个组成部分

1、容器:特殊的数据结构,实现了数组、链表、队列等,实质是类模板。

2、迭代器:一种复杂的指针,可以通过其读写容器中的对象,实质是运算符重载。

3、算法:读写容器对象的逻辑算法:排序、遍历、查找.......,实质是模板函数。

4、空间配置器:分配空间。

5、配接器:用来修饰容器、仿函数、迭代器接口,配合仿函数使用。

6、仿函数:类似函数,通过重载()运算符来模拟函数行为的类

组件间的关系

容器通过配置器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套接仿函数。

vector(单向数组)

规定只能从尾巴进行插入、尾巴进行删除,数组空间可扩容。

可以在中间插入删除,但不建议使用。

成员函数(迭代器相关)

begin:返回指向元素首地址的迭代器(指向元素开头),++操作(后)右走iterator

end:返回指向元素末尾的迭代器,最后一个元素的下一个位置。iterator

rbegin:逆向迭代器(指向元素末尾),++操作(前)左走reverse_iterator

rend:逆向迭代器(指向元素开头)reverse_iterator

cbegin:返回一个常量迭代器,指向vector容器的第一个元素的位置。const_iterator

cend:返回一个常量迭代器,指向容器中最后一个元素的下一个位置。const_iterator

容量

size:返回元素个数。

max_size:容量

resize:改变大小

empty:判空

重载

at

使用方法

push_back:入栈。

back:返回最后一个元素。

pop_back:出栈,删除,无返回值。

insert:插入

swap:交换

clear:清空

sort:排序,头文件<algorithm>

erase:删除迭代器指向元素/删除一段元素

例:

vector<int> arr; //定义了一个名为arr的vector容器,arr容器中每个元素为int类型。

vector<vector<int>> arr; //定义了一个名为arr的二维容器,此容器中每个元素是一个int类型的容

器。

vector<int> arr (5); //定义了一个名为arr的vector容器,vector容器中共有5个元素,每个元素为int类型。

vector<int> arr (3,100); //定义了一个名为arr的vector容器,vector容器中共有3个元素,每个元素都初始化为100。

push_back:自动扩容

\]:会自动扩容 ![](https://file.jishuzhan.net/article/1762266428095860737/828576be641b645c610f16285ef7370f.webp) at:需要设置容量 ![](https://file.jishuzhan.net/article/1762266428095860737/a85825d361e27932c5a09fa59e892996.webp) 迭代器:指针,vector成员iterator ![](https://file.jishuzhan.net/article/1762266428095860737/ae70862e75f6693b38e46b7c6ef18484.webp) swap:交换元素值 ![](https://file.jishuzhan.net/article/1762266428095860737/d2e01779b6672f1f0976eac2bd14c174.webp) sort:升序排序 头文件\ ![](https://file.jishuzhan.net/article/1762266428095860737/25e9c416690df1c07288a1f4dd675260.webp) erase:删除迭代器指向元素 ![](https://file.jishuzhan.net/article/1762266428095860737/392553933597d6909174e7c3215d5286.webp) erase:删除一段元素 ![](https://file.jishuzhan.net/article/1762266428095860737/0d9663008689b64a7e8cbffd5875d5dc.webp) **总结** vector向量相当于一个数组,在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。 优点: 可以不指定大小,使用push_back、pop_back来进行动态操作。 随机访问方便,即支持\[ \]操作符与at() 节省空间 缺点: 在内部进行插入、删除的效率低。 只能在最后进行push和pop。 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。 * ### list(双向链表) 每一个节点都包含一个信息块Infor,一个前驱指针Pre,一个后驱指针Post。可以不分配必须的内存大小,方便进行增加和删除操作。使用的是非连续的内存空间进行存储。常使用迭代器进行操作。 优点: 不使用连续内存完成动态操作; 在内部方便得进行插入和删除操作; 可在两端进行push、pop 缺点: 不能在内部进行随机访问,即不支持.at()、\[ \]操作符 相对于vector占用内存多(vector只有数据块,list多了指针) 访问list一般情况都使用迭代器。 **函数** push_front:头插 push_back:尾插 pop_front:头出 pop_back:尾出 **成员函数(迭代器相关)** begin、end、rbegin、rend、cbegin、cend、crbegin、crend ![](https://file.jishuzhan.net/article/1762266428095860737/42a52ddbd166a09542da913becd5be0b.webp) **容量** empty、size、max_size ![](https://file.jishuzhan.net/article/1762266428095860737/0144183be1fec46a8b1671d1eaaded18.webp) **使用方法** insert、erase、swap、resize、clear ![](https://file.jishuzhan.net/article/1762266428095860737/8fd9fcb4c7c89190e3c9cc90f96c23f0.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/e85b51b61ed440c83a16764890214c37.webp) **示例** begin、end ![](https://file.jishuzhan.net/article/1762266428095860737/37c85ca7b1aa10f2566f02f2ce07f279.webp) rbegin、rend返回reverse_iterator逆向迭代器 ![](https://file.jishuzhan.net/article/1762266428095860737/b442bd59ce9e15579cb6d5b83e4db735.webp) cbegin、cend返回const_iterator常量迭代器 ![](https://file.jishuzhan.net/article/1762266428095860737/c01f8500fbe1377c6ae7e73cd8bca7f9.webp) **总结** 双向链表;插入和删除在任意位置效率都很高;不能随机访问,不支持\[ \],at();访问list一般情况都使用迭代器。 * ### deque(双向队列) 存储方式采用分块存储;deque在功能上合并了vector和list。 优点: 随机访问方便,即支持\[ \]和vector.at(); 在内部方便地进行插入和删除操作; 可在两端进行push、pop。 缺点: 占用内存多。 ![](https://file.jishuzhan.net/article/1762266428095860737/a40178dfe5a8114c2d63f6a95b95c3d2.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/c2b811415f3d9cdd3ed2195e119fb462.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/763e5378452c181dcc4b27f75d1d689a.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/a42e44b38f2aad44e77ca6f37d7a773f.webp) erase:删除迭代器所指位置/一段数据 deque\ mydeque; 1、mydeque.erase(mydeque.begin()+5); //begin()返回的是迭代器(指针) 2、mydeque.erase(mydeque.begin(),mydeque.begin()+3); C++11新特性 emplace : insert emplace_front : push_front emplace_back : push_back **使用区分** **如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector;** **如果你需要大量的插入和删除,而不关心随机存取,则应使用list;** **如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque。** **STL序列容器:vector、deque、list** **STL关联容器:set、multiset、map、multimap** **STL迭代器:iterator** * ### set(集合) set是一个有序的集合,其中的元素插入后就会按照某种规则进行排序,从小到大。 内部红黑树,无值相同的元素。 ![](https://file.jishuzhan.net/article/1762266428095860737/f90606f6f6799df43bd55d3a4d1c8d33.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/4db2539ddeb5b8a2aeb853e828b605a2.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/b965bbc8314982a8ca48bd1196fe9979.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/2ca6ba5ce57b1fecf91c948c19b9086d.webp) s.find:返回指向查找的指定元素的迭代器 s.count:查找指定数据是否存在,存在则1,不存在则0 `lower_bound:`函数返回的迭代器指向的元素是集合中第一个不小于给定值的元素。 `upper_bound:`函数返回一个指向大于给定值的元素的迭代器,即返回指向第一个大于给定值的元素的迭代器。 **示例** 从小到大排列,且插入相同的值,只有第一次有效。 ![](https://file.jishuzhan.net/article/1762266428095860737/6bcca345586ea1463fa4ef57dda49c5c.webp) count:查找指定数据是否存在,存在则1,不存在则0 ![](https://file.jishuzhan.net/article/1762266428095860737/43fde879bfd44331c0f4b380996e2e3c.webp) 红黑树排列:12578 erase:删除2-8之间的元素(包括2,不包括8) find:返回指向查找的指定元素的迭代器。 ![](https://file.jishuzhan.net/article/1762266428095860737/b3fb28020eac80a5530aa95464449e65.webp) 排序:12578 lower_bound:由于有5,则返回指向5的迭代器,无则指向5的下一位数7 upper_bound:指向给定值7的下一位数8 erase:删除5-8之间的数(包括5,不包括8) ![](https://file.jishuzhan.net/article/1762266428095860737/1c96c74a07147f1615f8227cd1614b15.webp) * ### map(图) 内部红黑树 是一种关联容器,用于存储键值对。每个键值对称为一个元素,键和值可以是任意数据类型。Map中的元素按照键的大小自动排序,并且每个键只能在map中出现一次。 ![](https://file.jishuzhan.net/article/1762266428095860737/bd654e9abaa738ee5142807ca649ffae.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/91e30e3f615494cb76d369e2c26de479.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/550290969192ff56fcacb62a2d1d4123.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/78d929a7c7da5499ca9e3c1e7554e81e.webp) ![](https://file.jishuzhan.net/article/1762266428095860737/5a4c530160c05027681ac5cea472a7d5.webp) map中键不能重复,重复则第二次为修改。 map中值可以相同。 map中会按照键从小到大排列 ![](https://file.jishuzhan.net/article/1762266428095860737/8c41c6972d57a3468b02bc580351a06b.webp) C++官网:www.cplusecpluse.com

相关推荐
liuluyang5301 小时前
C语言C11支持的结构体嵌套的用法
c语言·开发语言·算法·编译·c11
凌叁儿1 小时前
python保留关键字详解
开发语言·python
明飞19872 小时前
C_内存 内存地址概念
c语言·开发语言
代码不停2 小时前
Java中的异常
java·开发语言
牛奶咖啡.8542 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组真题
c语言·数据结构·c++·算法·蓝桥杯
兮兮能吃能睡2 小时前
Python中的eval()函数详解
开发语言·python
狄加山6753 小时前
Qt模型-视图架构
开发语言·qt
Aphelios3803 小时前
TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
java·开发语言·前端·javascript·ecmascript·todo
odoo中国3 小时前
Python 深度学习实战 第1章 什么是深度学习&代码示例
开发语言·python·深度学习
pumpkin845143 小时前
Rust 是如何层层防错的
开发语言·rust