![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++ STL
文章平均质量分 84
cpp 标准模板库
ZhengXinTang
习重要! 学而实习之, 才叫学习!
只学而不习, 不实践, 这叫本末倒置, 丢了大头顾小头;
因缘际会,所有巧合即为 和合事物;
当一个人悄悄的在反省时,努力时,改过时, 命运的齿轮便被他转动了。
展开
-
强类型语言与模板的前世今生
计算机编程语言种类繁多,目前能够查询到的有 600 多种,常用的不超过 20 种,TIOBE 每个月都会发布世界编程语言排行榜,统计前 50 名编程语言的市场份额以及它们的变动趋势。该榜单反映了编程语言的热门程度,程序员可以据此来检查自己的开发技能是否跟得上趋势,公司或机构也可以据此做出战略调整。这些编程语言根据不同的标准可以分为不同的种类,根据“在定义变量时是否需要显式地指明数据类型”可以分为强类型语言和弱类型语言。1 强类型语言强类型语言在定义变量时需要显式地指明数据类型,并且一旦为变量指明了某原创 2022-04-17 16:28:02 · 183 阅读 · 0 评论 -
一. c++ 中的函数模板
泛型程序设计: 是指一种算法在实现时, 不需要指定具体操作的数据类型;“泛型”: 指的便是算法(内部逻辑,操作的顺序步骤)只要实现一遍, 就能适用于多种数据类型,从而可以减少重复代码的编写;从而generic Programming 泛型编程设计: 便是指编写大量的模板, 以及使用这些模板的程序设计;它首次出现于 1983 年的 Ada 语言, 而将模板的概念引入到 C++ 的成功应用,便是 c++ 的标准模板库(STL)在 C++ 中,模板分为函数模板和类模板两种。合格的 C++ 程序.原创 2022-04-17 15:20:58 · 439 阅读 · 0 评论 -
一. c++ 中的类模板
C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。1.1 类模板的定义声明类模板的语法为:template<typename 类型参数1 , typename 类型参数2 , …> class 类名{ //TODO:};类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来.原创 2022-04-17 16:03:23 · 480 阅读 · 0 评论 -
2-1 C++ 中的STL 简介
本文源自于 C 语言中文网:前面介绍了 函数模板 和 类模板 两个概念,C++ 对模板(Template)支持得很好,整个STL(Standard Template Library) 提供了通用的模板类和模板函数;这些模板类和模板函数就是使用模板把常用的数据结构(如向量、链表、队列、栈)及其算法都实现了一遍,并且做到了数据结构和算法的分离。自 1998 年 ANSI/ISO C++ 标准正式定案,C++ STL 规范版本正式通过以后,由于各个 C++ 编译器厂商, 在开源版本的基础上,实现了.原创 2022-04-17 17:55:48 · 146 阅读 · 0 评论 -
2-2 C++中的容器分类
在实际的开发过程中,合理组织数据的存取与选择处理数据的算法同等重要,存取数据的方式往往会直接影响到对它们进行增删改查操作的复杂程度和时间消耗。事实上,当程序中存在对时耗要求很高的部分时,数据结构的选择就显得尤为重要,有时甚至直接影响程序执行的成败。值得一提的是,之前我们一直在不断地重复实现一些诸如链表、集合等等这些常见的数据结构,这些代码使用起来往往都十分类似,只是为了适应不同数据的变化,可能需要在一些细节上做不同的处理。那么大家有没有想过,是不是可以重复利用那些已有的实现来完成当前的任务呢?当然是.原创 2022-04-17 20:32:39 · 1418 阅读 · 0 评论 -
2-3容器的迭代器
1. 迭代器的产生无论是序列容器还是关联容器,最常做的操作无疑是遍历容器中存储的元素,而实现此操作,多数情况会选用“迭代器(iterator)”来实现。那么,迭代器到底是什么呢?我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。既然类似,完全可以利用泛型技术,将它们设计成适用所有容器的通用算法,从而将容器和算法分离开。但实现此目的需要有一个类似中介的装置,它除原创 2022-04-17 21:04:36 · 949 阅读 · 0 评论 -
2-4 容器中元素的遍历方式
1. 容器中元素的遍历容器中元素遍历的四种方式;使用 迭代器;for each 语法;增强型 for 循环;for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。以map 容器,举例, 遍历map 容器中的元素;由于 map 是关联式容器, 里面存储的元素 是一个个 ”键值对 “ &原创 2022-04-28 09:17:53 · 295 阅读 · 0 评论 -
3-1 C++中序列式容器
所谓序列容器,即以线性排列(类似普通数组的存储方式)来存储某一指定类型(例如 int、double 等)的数据,需要特殊说明的是,该类容器并不会自动对存储的元素按照值的大小进行排序。需要注意的是,序列容器只是一类容器的统称,并不指具体的某个容器,序列容器大致包含以下几类容器:array<T,N>(数组容器):表示可以存储 N 个 T 类型的元素,是 C++ 本身提供的一种容器。此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值;vector(向量容器)原创 2022-04-18 09:35:34 · 901 阅读 · 0 评论 -
3-3-1 序列式容器之vector 容器详解
vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移原创 2022-04-27 21:07:39 · 559 阅读 · 0 评论 -
3-3-2 序列式容器之vector 容器迭代器
在《STL array随机访问迭代器》一节中,详细介绍了 array 容器迭代器,vector 容器迭代器和前者有很多相同之处。比如,vector 容器的迭代器也是随机访问迭代器,并且 vector 模板类提供的操作迭代器的成员函数也和 array 容器一样(如表 1 所示)。...原创 2022-04-27 21:21:13 · 431 阅读 · 0 评论 -
3-3-3 序列式容器之vector 容器的元素访问
学会如何创建并初始化 vector 容器之后,本节继续来学习如何获取(甚至修改)容器中存储的元素。访问vector容器中单个元素首先,vector 容器可以向普通数组那样访问存储的元素,甚至对指定下标处的元素进行修改,比如:...原创 2022-04-27 21:24:51 · 2291 阅读 · 0 评论 -
3-3-4 序列式容器之vector 容器的元素添加与元素插入
要知道,向 vector 容器中添加元素的唯一方式就是使用它的成员函数,如果不调用成员函数,非成员函数既不能添加也不能删除元素。这意味着,vector 容器对象必须通过它所允许的函数去访问,迭代器显然不行。在 《STL vector容器详解》一节中,已经给大家列出了 vector 容器提供的所有成员函数,在这些成员函数中,可以用来给容器中添加元素的函数有 2 个,分别是 push_back() 和 emplace_back() 函数。有读者可能认为还有 insert() 和 emplace() 成员函数原创 2022-04-27 21:33:15 · 6731 阅读 · 0 评论 -
3-3-5 序列式容器之vector 容器的元素删除
前面提到,无论是向现有 vector 容器中访问元素、添加元素还是插入元素,都只能借助 vector 模板类提供的成员函数,但删除 vector 容器的元素例外,完成此操作除了可以借助本身提供的成员函数,还可以借助一些全局函数。基于不同场景的需要,删除 vecotr 容器的元素,可以使用表 1 中所示的函数(或者函数组合)。...原创 2022-04-27 21:40:39 · 1089 阅读 · 0 评论 -
3-4-1 deque 容器介绍
deque 是 double-ended queue 的缩写,又称双端队列容器。前面章节中,我们已经系统学习了 vector 容器,值得一提的是,deque 容器和 vecotr 容器有很多相似之处,比如:deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque 容器也可以根据需要修改自身的容量和大小。和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque原创 2022-04-27 21:53:53 · 498 阅读 · 0 评论 -
3-4-2 deque 容器的迭代器用法
eque 容器迭代器的类型为随机访问迭代器,deque 模板类提供了表 1 所示这些成员函数,通过调用这些函数,可以获得表示不同含义的随机访问迭代器。有关迭代器及其类型的介绍,可以阅读《C++ STL迭代器(iterator)》一节,本节不再做具体介绍。表 1 deque 支持迭代器的成员函数成员函数 功能begin() 返回指向容器中第一个元素的正向迭代器;如果是 const 类型容器,在该函数返回的是常量正向迭代器。end() 返回指向容器最后一个元素之后一个位置的原创 2022-04-27 21:54:14 · 1262 阅读 · 0 评论 -
3-4-3 deque 容器中的元素访问
通过《STL deque容器》一节,详细介绍了如何创建一个 deque 容器,本节继续讲解如何访问(甚至修改)deque 容器存储的元素。和 array、vector 容器一样,可以采用普通数组访问存储元素的方式,访问 deque 容器中的元素,比如:#include #include using namespace std;int main(){dequed{ 1,2,3,4 };cout << d[1] << endl;//修改指定下标位置处的元素d[1] =原创 2022-04-27 21:54:41 · 782 阅读 · 0 评论 -
3-4-4 deque 容器中元素的添加和删除
deque 容器中,无论是添加元素还是删除元素,都只能借助 deque 模板类提供的成员函数。表 1 中罗列的是所有和添加或删除容器内元素相关的 deque 模板类中的成员函数。表 1 和添加或删除deque容器中元素相关的成员函数成员函数 功能push_back() 在容器现有元素的尾部添加一个元素,和 emplace_back() 不同,该函数添加新元素的过程是,先构造元素,然后再将该元素移动或复制到容器的尾部。pop_back() 移除容器尾部的一个元素。原创 2022-04-27 21:52:50 · 336 阅读 · 0 评论 -
4-1 C++ 中的关联式容器
在《C++ STL容器》一节中讲到,C++ 容器大致分为 2 类,即序列式容器和关联式容器。其中,序列式容器(包括 array、vector、list、deque 和 forward_list)已经在前面章节中做了详细的介绍,从本节开始,将逐个对 C++ STL 标准库中的所有关联式容器做详细的讲解。提到 C++ STL 关联式容器,读者可能会以下一些疑问:关联式容器是什么,具有哪些特点?和序列式容器相比,关联式容器有什么不同?关联式容器的种类有哪些?别急,读完本文,这些疑问都会迎刃而解。C++原创 2022-04-18 09:47:16 · 406 阅读 · 0 评论 -
4-2 关联式容器中的pair 类模板
1. 关联式容器中的键值对关联式容器存储的是“键值对”形式的数据,比如:<“C语言教程”, “http://c.biancheng.net/c/”><“Python教程”, “http://c.biancheng.net/python/”><“Java教程”, “http://c.biancheng.net/java/”>如上所示,每行都表示一个键值对,其中第一个元素作为键(key),第二个元素作为值(value)。注意,基于各个关联式容器存储数据的特点,只有原创 2022-04-18 10:01:08 · 374 阅读 · 0 评论 -
5.1 c++ STL 容器适配器简介
1. 适配器简介在详解什么是容器适配器之前,初学者首先要理解适配器的含义。其实,容器适配器中的“适配器”,和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道,无论是电脑、手机还是其它电器,充电时都无法直接使用 220V 的交流电,为了方便用户使用,各个电器厂商都会提供一个适用于自己产品的电源线,它可以将 220V 的交流电转换成适合电器使用的低压直流电。从用户的角度看,电源线扮演的角色就是将原本不适用的交流电变得适用,因此其又被称为电源适配器。2. 容器适配器简单理解 容器适配器, 就原创 2022-04-25 10:08:27 · 465 阅读 · 1 评论 -
5.2 stack 容器适配器
1. 栈stack 栈适配器是一种单端开口的容器(如图 1 所示),实际上该容器模拟的就是栈存储结构,即无论是向里存数据还是从中取数据,都只能从这一个开口实现操作。如图 1 所示,stack 适配器的开头端通常称为栈顶。由于数据的存和取只能从栈顶处进行操作,因此对于存取数据,stack 适配器有这样的特性,即每次只能访问适配器中位于最顶端的元素,也只有移除 stack 顶部的元素之后,才能访问位于栈中的元素。栈中存储的元素满足“后进先出(简称LIFO)”的准则,stack 适配器也同样遵循这一准则原创 2022-04-25 10:42:08 · 188 阅读 · 0 评论 -
5.4 queue 队列容器适配器
和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据,如图 1 所示。queue容器适配器图 1 queue容器适配器这种存储结构最大的特点是,最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有“先进先出(简称 “FIFO” )”的特点,因此 queue 又称为队列适配器。其实,STL queue 容器适配器模拟的就是队列这种存储结构,因此对于任何需要用队列进行处理的序列来说,使用.原创 2022-04-26 10:29:35 · 297 阅读 · 0 评论 -
5.6 priority_queue优先队列容器适配器
priority_queue 容器适配器模拟的也是队列这种存储结构,即使用此容器适配器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。但是,priority_queue 容器适配器中元素的存和取,遵循的并不是 “First in,First out”(先入先出)原则,而是“First in,Largest out”原则。直白的翻译,指的就是先进队列的元素并不一定先出队列,而是优先级最大的元素最先出队列。注意,“First in原创 2022-04-26 10:43:16 · 179 阅读 · 0 评论 -
6-5 C++ STL begin()和end()函数用法
在前面章节中,我们已经对 C++ STL标准库提供的所有容器做了系统的讲解。读者可能已经注意到,无论是序列式容器还是关联式容器(包括哈希容器),不仅模板类内部提供有 begin() 和 end() 成员方法,C++ STL 标准库中还提供有同名且具有相同功能的 begin() 和 end() 函数。首先需要说明的是,begin() 和 end() 是以函数模板的形式定义的,但它们的模板并没有位于某一个头文件中,而是很多头文件中都有它们的定义。C++ STL 标准库中,包含 begin() 和 end.原创 2022-04-18 10:09:47 · 669 阅读 · 0 评论