C++STL——概述
一、相关介绍
STL
- 标准模板库
- 在编写代码的过程中有一些程序经常会被用到,而且需求特别稳定,所以C++中把这些常用的模板做了统一的规范,慢慢的就形成了STL
- 提供三种类型的组件: 容器、迭代器和算法,它们都支持泛型程序设计标准
容器
- 顺序容器(vector、list、deque):通过元素在容器中的位置顺序存储和访问元素
- 关联容器(set、map、multiset、multimap):通过键(
Key)存储和读取元素 - 容器适配器(stack、queue、priority_queue)
迭代器
- 一种检查容器内元素并遍历元素的数据类型
- 每种容器类型都定义了自己的迭代器类型
- 包括:双向迭代器、随机迭代器
二、容器
【顺序容器】
- 顺序容器中元素排列顺序与其值无关,而仅仅由元素添加到容器里的次序决定
- 容器内的元素类型必须至少满足2个条件:可复制和可赋值
- 所有的迭代器范围都是左闭右开区间,[beg,end) 包括beg,但不包括end
标准库定义了三种顺序容器:vector,list和deque。
vector——连续存储的元素,单向的
list——由节点组成的不连续存储的双向链表
deque——连续存储的元素,双向的
它们的区别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。
如下图:

【关联容器】
- 独特之处在于支持键的使用
- 支持通过键来高效地查找和读取元素
标准库定义了两种关联容器:set,map
set——仅含一个键,并有效地支持关于某个键是否存在的查询
map——元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的元素

一般来说,如果希望有效的存储不同值的集合,那么set容器比较合适,而map容器则更适用于需要存储(乃至修改)每个键所关联值的情况。
在做某种文本处理时,可使用set保存要忽略的单词。而字典则是map的一种很好的应用:单词本身是键,而它的解释说明则是值。
map和set类型的对象所包含的元素都具有不同的键,不允许同一个键添加第二个元素。如果一个键必须对应多个实例,则需要使用multimap和multiset类型。
【容器适配器】
- 不是第一类容器
- 没有提供与元素的保存形式有关的真正数据结构实现
- 适配器都是建立在某个顺序容器之上的
- 适配器不支持迭代器
- 优点:能够使程序员选择一种合适的底层数据结构
STL提供了三种容器适配器:stack,queue,priority_queue。
statck——可以建立在vector,list,deque任何一种容器之上
queue——要求关联容器提供front操作,所以只有list和deque满足
priority_queue——要求提供随机访问功能 ,所有只有vector和deque满足
- stack类允许在底层数据结构的一端执行插入和删除操作(先入后出)。堆栈能够用任何顺序容器实现:vector、list、deque。
- queue类允许在底层数据结构的末尾插入元素,也允许从前面插入元素(先入先出)。队列能够用STL数据结构的list和deque实现,默认情况下是用deque实现的。
- priority_queue类,能够按照有序的方式在底层数据结构中执行插入操作,也能从底层数据结构的前面执行删除操作。priority_queue能够用STL的序列容器vector和deque实现。默认情况下使用vector作为底层容器的。当元素添加到priority_queue时,它们按优先级顺序插入。这样,具有最高优先级的元素,就是从priority_queue中首先被删除的元素。通常这是利用堆排序来实现的。堆排序总是将最大值(即优先级最高的元素)放在数据结构的前面。这种数据结构称为(heap)。
三、迭代器
一、迭代器的变化
和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。
在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。
二、迭代器的实现
迭代器是一个对象,vector的迭代器是封装了数组下标;list、map、set的迭代器是封装了元素节点的指针。
还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n),2是set中元素的值不可改变。
【小问题】
set是基于红黑树实现的,那么set的迭代器begin()、end()是指向哪里的呢?
一个测试程序:
#include<iostream>
#include<set>
using namespace std;
int main(){
set<int> myset;
myset.insert(4);
myset.insert(7);
myset.insert(2);
myset.insert(0);
myset.insert(4);
set<int>::iterator it;
for(it = myset.begin(); it != myset.end(); it++){
cout<< *it; //输出结果是:0247
}
}
红黑树首先是二叉搜索树,所以begin()迭代器指向红黑树的最左边的节点,end()迭代器指向红黑树的最右边的节点。另外这个小程序还说明了重复插入无效。
(1)STL中迭代器容器中都要注意的地方(vector中已经提到):
1)任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)
2)begin()指向的是vec中的第0个元素,而end是指向最后一个元素的后面一个位置(不是最后一个元素)
3)迭代器的时效性,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果
(2)list的迭代器是双向迭代器(只能++ --,没有偏移功能)而不是像vector那样的随机迭代器(和指针几乎一样的所有功能)
在list中,由于其内存是非连续的,因此不能像vector那样,用[]操作符取值,只能用迭代器。
(3)list和vector的区别,本质区别:list是链式存储,vector在内存中是连续区别的,有本质区别而导致下面区别
1)list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素,而list是不可以的
2) list的插入和删除效率很高,所以list有push_front、pop_front、sort而vector中这些操作的效率太低了,所以STL中没有写这些功能
与vector相比,list除了有push_back()//在尾部插入 和 insert()之外,还有push_front()//即在链表的头部插入
3)list的一些特有的函数remove、reverse、unique、splice、merge功能(这些连deque中都没有的)
C++STL——概述的更多相关文章
- 1.1 STL 概述
综述 STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R M ...
- STL概述
一.关于STL STL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分.STL 以模板类和模板函数的形式为程序员提供了各种数据结构和算法的精巧实现,程 ...
- c++ STL概述
2018-09-26 c++ STL(标准模板库)是一套通过c++模板类实现的标准类库,提供了通用的模板和函数,功能强大,大大的提高了c++的开发效率. c++ STL的核心主要包括三个组件:(1)容 ...
- [转载]C++STL概述
来源:https://www.cnblogs.com/dyllove98/p/3214898.html 什么是容器 首先,我们必须理解一下什么是容器,在 C++ 中容器被定义为:在数据存储上,有一种对 ...
- C++ STL 概述_严丝合缝的合作者们
1. 初识 STL 什么是STL? STL(Standard Template Library) 是C++以模板形式提供的一套标准库,提供了很多开发过程需要的通用功能模块.使用 STL ,可以让开发者 ...
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转】三十分钟掌握STL
转自http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以 ...
- 三十分钟掌握STL
这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有所收获,那么赶紧扔了 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
随机推荐
- css的基础用法(下)
定位: <html> <head> <meta charset="utf-8" /> <title>定位</title> ...
- Interview Question Overload、Refactoring和Override?
Overload Overload我们百度翻译知道是超载的意思,不过我们一般称其为重载,在这里我们不纠结于它的翻译,我们来讲讲重载是什么意思,重载的好处.在下面我们以Overload来代表重载(为了记 ...
- MySQL数据库主从(主主)配置
一.系统环境: centos7.4 (centos 1708) mysql 5.7 master主机的IP地址为192.168.159.50 slave主机的IP地址为192.168.159.51 M ...
- xcode 快捷键大全、XCode常用快捷键图文介绍
其实就是设置里面的快捷键变成了文字版,刚开始用Xcode是不是发现以前熟悉的开发环境的快捷键都不能用了?怎么快捷运行,停止,编辑等等.都不一样了.快速的掌握这些快捷键,能提供开发的效率. 其实快捷键在 ...
- react.js中实现tab吸顶效果问题
在react项目开发中有一个需求是,页面滚动到tab所在位置时,tab要固定在顶部. 实现的思路其实很简单,就是判断当滚动距离scrollTop大于tab距离页面顶部距离offsetTop时,将tab ...
- Javascript中的内存泄漏
最新博客站点:欢迎来访 一.内存泄漏 由于某些原因不再需要的内存没有被操作系统或则空闲内存池回收.编程语言中有多种管理内存的方式.这些方式从不同程度上会减少内存泄漏的几率,高级语言嵌入了 ...
- BZOJ1432: [ZJOI2009]Function(找规律)
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1523 Solved: 1128[Submit][Status][Discuss] Descriptio ...
- keil5 mdk使用ST-Link II下载出现cannot halt the core解决办法
在正常的程序里面,我添加了MB85RS16(spi flash)这个外设驱动代码后,使用ST-Link II下载就出现cannot halt the core. 这个现象之前出现过1次,但是解决办法忘 ...
- 数据分析处理库Pandas——常用操作
DataFrame结构排序 备注:group列降序,data列升序. 合并相同项 查找相同项 添加一列,值是其他列的值进行相关操作后的值 删除列 Series结构替换值 一组值按照范围归类 归类后每类 ...
- STL——泛型编程
1.指针的算术运算 对于一个存储int数据的vector,我们要查找某值是否存在于其中,采用下标操作的做法如下: int* find(const vector<int> &vec, ...