首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Standard Template Libary or C++ Standard Library

编程知识
2024年07月21日 06:45

  C++提供一套标准的library称为C++ standard library完全以template完成,所以又被称为Standard Template Library。这套library专门有于实现常用的据结构(例如arry、list......)以及常用的算法(例如push,pop,insert,delete,query,retrieval......)。

  一般来说,STL包含六个主要的组件:

  1.containers(泛型容器)

  2.generic algorithms(泛型算法)

  3.iterators(泛型指针)

  4.function objects

  5.adaptors

  6.allocators

  以下简单介绍前三个组件,让大家领略一下template的强大弹性。

一、STL Cintainers

  STL实现了一些常用的数据结构,这些结构用来收容许多数据,所以被称为container,主要分为两大类:

  1. sequence container:内含有序而类型一致的元素。例如vector(也就是array)和list,以及deque。deque的行为类似vector,但对于插入(insertion)和删除(deletion)第一个元素特别有效率;

  2.associative container:这种数据结构对于查询(query)或取出(retrieval)某一个元素的动作特别有效率。例如map和set。所谓map是key/value的成对组合:key用来查询,value包含真正的数据。电话簿和字典都适合以map来完成,所以map又被 称为dictionary。

  mapt 和set中的每一个key都只能出现一次,如果key必需出现一次以上,则另有所谓的multimap和multiset适用。

  以下我举一个vector实例,让大家见识一下template classes的弹性。

 1 #include <vector> // STL's vector
 2 #include <iostream>
 3 using namespace std;
 4 void main(){
 5     vector<int> ivec;
 6     cout << "ivec: size: " << ivec.size() << " "
 7     << "capacity: " << ivec.capacity() << endl;
 8      for (int ix = 0; ix < 24; ix++)
 9         {
10             ivec.push_back( ix );
11             cout << "ivec: size: " << ivec.size() << " "             
12           "capacity: " << ivec.capacity() << endl;
13          }
14  }               

  程序解析:

  第1行:使用STL vector必需导入<vector>这个头文件;

  第3行:STL中所有的classes、functions、templates、types都定义于一个特殊的namespace std之中,第3行的用意是让我们的程序能够识别到那个std namespace。

  第5行:声明一个vector,名称为ivec,内部可以放数据类型为int的元素。

  第6、7行:在尚未对ivec加入任何元素之前,检查其大小与容量,所谓的大小(size)是指vector内的元素个数,所谓容量(capacity)是指这个vector目前可以装多少元素。

  第8~13行:加入24个元素到ivec中,每加入一个元素,就检查ivec的大小与容量,这里我们用到了vector的三个member functions:push_back()、size()、capacity().

  执行结果:

ivec: size: 0 capacity: 0
ivec: size: 1 capacity: 1
ivec: size: 2 capacity: 2
ivec: size: 3 capacity: 4
ivec: size: 4 capacity: 4
ivec: size: 5 capacity: 8
ivec: size: 6 capacity: 8
ivec: size: 7 capacity: 8
ivec: size: 8 capacity: 8
ivec: size: 9 capacity: 16
ivec: size: 10 capacity: 16
ivec: size: 11 capacity: 16
ivec: size: 12 capacity: 16
ivec: size: 13 capacity: 16
ivec: size: 14 capacity: 16
ivec: size: 15 capacity: 16
ivec: size: 16 capacity: 16
ivec: size: 17 capacity: 32
ivec: size: 18 capacity: 32
ivec: size: 19 capacity: 32
ivec: size: 20 capacity: 32
ivec: size: 21 capacity: 32
ivec: size: 22 capacity: 32
ivec: size: 23 capacity: 32
ivec: size: 24 capacity: 32

  我们可以从执行结果归纳出两个结论:

  1.vector的容量是可以变化的;

  2.vector的容量(capacity)变化,是以power of 2累增;

二、STL Generic Algorithm(泛型算法)

  为了对付STL的各种containers,以及C++本身的内置数据类型,STL提供了一组所谓的generic algorithm(泛型算法)。称之为algorithhm,是因为这些函数都用来执行最普遍的动作,比如排序、搜索、最大值、最小值等等。之所以称为generic(泛型)则是因为它们适用于各种container types,包括STL的vector,list,set,map,以及语言内置的build-in array type。

  STL提供的generic algorithm非常多,比如一个简单的”字串倒序“实例:

 1 #include <iostream.h>
 2 #include <algorithm> // STL
 3 #include <string.h>
 4 using namespace std; // STL
 5 void main(){
 6     char* string1 = "ABCBEFGHJK";
 7     cout << string1 << endl;
 8     int N1 = strlen(string1);
 9     reverse(string1, string1 + N1);
10     cout << string1 << endl;
11  }

  执行结果:

  ABCDEFGHJK

  KJHGFEDCBA

  程序解析:

  第2行:使用generic algorithm,必需导入<algorithm>这个头文件;

  第4行:STL中所有的classes、functions、templates、types都定义于一个特殊的namespace std之中,第4行的用意是让我们的程序能够识别到那个std namespace。

  第9行:使用reverse()(一个generic algorithm)来逆转字符串,此函数的两个参数都是操作对象(某个container)的iterators,分别批向第一个元素和最后一个元素。所谓iterator是一个泛型指针。

 三、STL Iterators(迭代器)

   STL containers的弹性很大,可以让你放置自定义类型的数据。STL Container之所以能够和STL generic algorithm发生连接,靠的是它的一对iterators,使得generic algorithm能够在container身上来回移动。

  所谓iterator,可以把它看成是一种泛型指针,它的作用是提供一般化的方法,使我们得以存取任何一种container中的任何一个元素。Iterator其实也是一个template class,它最少必需提供四个operators:

  1.increment operator:用以移往下一个元素,例如++iter。

  2.dereference operator:用以取出真正的元素个体,例如:*iter。

  3.equlity operator:用以判断两个iterators是否相等,例如iter1==iter2。

  4.inequlity operator:用以判断两个iterators是否不相等,例如:iter1 !=iter2.

  任何一个STL container type都必须提供两个member functions:begin()和end(),传回的iterator分别指向container的第一个和最后一个元素,下面是以先前的vector<int>ivec为例,示范iterator的声明与应用:

1 vector<int> ivec;
2 ...
3 vector<int>::iterator iter = ivec.begin();
4 vector<int>::iterator iter_end = ivec.end();
5 for (; iter != iter_end; ++iter)
6 cout << *iter << endl;

  最后的for loop 可以将ivec内部的元素全部显示到屏幕上;

 

From:https://www.cnblogs.com/ruanchunyi/p/18314124
本文地址: http://shuzixingkong.net/article/236
0评论
提交 加载更多评论
其他文章 GIS前沿技术
无论是初步接触到GIS的学生,还是对GIS已经有一定的了解的从业者,肯定都非常关心两个问题:GIS有没有发展前景,GIS有哪些应用价值? 关于这两个问题,笔者的答案是GIS作为一门融合了空间数据采集、存储、处理、分析和可视化的学科,涉及到多个交叉领域和技术,因此非常容易与时下流行的前沿科技相结合,因
GIS前沿技术 GIS前沿技术 GIS前沿技术
如何在.NET Framework及.NET8以前项目中使用C#12新特性
前两天发了一篇关于模式匹配的文章,链接地址,有小伙伴提到使用.NET6没法体验 C#新特性的疑问, 其实呢只要本地的SDK源代码编译器能支持到的情况下(直接下载VS2022或者VS的最新preview版本) 只需要做很小的改动就可以支持的. 目前仍然还有一些小伙伴因为历史原因可能还在写.NET Fr
如何在.NET Framework及.NET8以前项目中使用C#12新特性
keepalived
四、Keepalived 【1】、keepalived运行原理 Keepalived检测每个服务器接节点状态 服务器节点异常或出现工作故障,keepalived将故障节点从集群系统中剔除 故障节点恢复后,Keepalived再将其加入到集群系统中 所有工作自动完成,无需人工干预 keepalived
keepalived
同时使用线程本地变量以及对象缓存的问题
同时使用线程本地变量以及对象缓存的问题 如有转载请著名出处:https://www.cnblogs.com/funnyzpc/p/18313879 前面 前些时间看别人写的一段关于锁的(对象缓存+线程本地变量)的一段代码,这段代码大致描述了这么一个功能: 外部传入一个key,需要根据这个key去全局
同时使用线程本地变量以及对象缓存的问题 同时使用线程本地变量以及对象缓存的问题 同时使用线程本地变量以及对象缓存的问题
Windows11下使用VcXsrv+xfce4实现图形化窗口
通过 sudo apt-get install xfce4-terminal sudo apt-get install xfce4 sudo service dbus restart 来安装所需要的软件包,期初我也是按部就班的通过网上搜索到的教程进行操作,例如: sudo nano ~/.bashr
Windows11下使用VcXsrv+xfce4实现图形化窗口
暑假java自学进度总结02
一.今日所学: 1.配置环境变量 在系统内配置java路径后,再在path中 利用系统路径配置Java编译工具和运行工具路径。 2.下载并安装Natepad++,并且配置相关设置 3.初步了解了Java的发展历程,能干什么,为什么被广泛使用,以及跨平台原理。 4.学习了JDK,JRE,JVE之间的关
暑假java自学进度总结02
thinkphp5.0 访问不存在的数据或者模块开启404页面并返回404状态码,在404页面中获取abort函数中使用的错误信息
thinkphp5框架默认未开启404页面,都是统一返回的一个异常页面。错误码为500,如果是使用的$this->error()方法则都是返回的200状态码。以前我一直都用的$this->error("page not found");方法来提示页面不存在,现在发现这样对于seo很不友好。因为不存在的数据也返回了200.正常来说,不存在的数据应该返回404.而不是200.否则会让搜索引擎认为是在作弊.thinkphp中针对于http的错误都是使用的异常。可通过abort函数来直接抛出异常。abort可传入http状态码和信息;极为方便。
thinkphp5.0 访问不存在的数据或者模块开启404页面并返回404状态码,在404页面中获取abort函数中使用的错误信息 thinkphp5.0 访问不存在的数据或者模块开启404页面并返回404状态码,在404页面中获取abort函数中使用的错误信息 thinkphp5.0 访问不存在的数据或者模块开启404页面并返回404状态码,在404页面中获取abort函数中使用的错误信息
《痞子衡嵌入式半月刊》 第 105 期
痞子衡嵌入式半月刊: 第 105 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回
《痞子衡嵌入式半月刊》 第 105 期 《痞子衡嵌入式半月刊》 第 105 期 《痞子衡嵌入式半月刊》 第 105 期