Standard Template Libary or C++ Standard Library
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内部的元素全部显示到屏幕上;
Standard Template Libary or C++ Standard Library的更多相关文章
- [c++] STL = Standard Template Library
How many people give up, because of YOU. Continue... 先实践,最后需要总结. 1. 数据流中的数据按照一定的格式<T>提取 ------ ...
- C++ Standard Template Library STL(undone)
目录 . C++标准模版库(Standard Template Library STL) . C++ STL容器 . C++ STL 顺序性容器 . C++ STL 关联式容器 . C++ STL 容 ...
- C++ Standard Template Library (STL) 高级容器
更多 STL 数据结构请阅读 NOIp 数据结构专题总结(STL structure 章节) std::map Definition: template < class Key, // map: ...
- <Standard Template Library>标准模板库专项复习总结(二)
4.队列 先进先出(FIFO)表 头文件:#include<queue> 变量的定义:queue<TYPE>queueName 成员函数: bool empty() 空队列返回 ...
- <Standard Template Library>标准模板库专项复习总结(一)
看了看博客园的申请时间也一年多了...想想自己一年多以来一直处于各种划水状态,现在又要面临ACM的冲击... 还是要抓紧时间赶紧复习一下了- -毕竟校园新生赛还是有奖金的.. 1.栈 先进后出(LIF ...
- EL and JSTL(Jsp Standard Tag Libary)(转)
一.什么是 EL 语言. 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音. 二.EL 语言的作用. 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAS ...
- 标准差standard deviation和标准错误standard error你能解释一下
by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...
- 对于随机变量的标准差standard deviation、样本标准差sample standard deviation、标准误差standard error的解释
参考:http://blog.csdn.net/ysuncn/article/details/1749729
- 剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题
一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如 ...
- MNI模板和Talairach 模板的对比
The MNI brain and the Talairach atlas SPM 96 and later use standard brains from the Montreal Neurolo ...
随机推荐
- AIRIOT智慧变电站管理解决方案
随着社会电气化进程的加速,电力需求与日俱增,变电站作为电网的关键节点,其稳定性和智能化管理水平直接关系到整个电力系统的高效运作.传统变电站管理平台难以适应现代电力系统复杂管理需求,存在如下痛点: 数据 ...
- 透过 Go 语言探索 Linux 网络通信的本质
前言 各种编程语言百花齐放.百家争鸣,但是 "万变不离其中".对于网络通信而言,每一种编程语言的实现方式都不一样:但其实,调用的底层逻辑都是一样的.linux 系统底层向上提供了统 ...
- c# - 如何在圆角 WPF 窗体中创建圆角矩形?
我正在 WPF 中创建一个应用程序,我想要圆角.收到.现在窗体是无边框的,我正在尝试创建一个圆角矩形并将其放在顶部,使其看起来像 Windows 应用程序的顶部栏. 我做不到. 这是我的代码: < ...
- harbor 构建企业级镜像仓库
安装harbor 构建企业级镜像仓库 Harbor是由VMware公司开源的镜像仓库,harbor是在docker Registry上进行了企业级扩展,从而获得了更广泛的应用,这些新的企业级特性包括: ...
- Hive 在工作中的调优总结
总结了一下在以往工作中,对于Hive SQL调优的一些实际应用,是日常积累的一些优化技巧,如有出入,欢迎在评论区留言探讨~ 一.EXPLAIN 查看执行计划 二.建表优化 2.1 分区 分区表基本操作 ...
- INFINI Labs 产品更新 | Gateway 支持基于 Kafka 的复制能力,发布 Helm Charts 部署方式
INFINI Labs 产品又更新啦~.本次更新概要如下:Easysearch 新增了索引字段相关统计 API,优化了 source_reuse 提升压缩效率:Gateway 新增诸多新特性,如:支持 ...
- 私密信息管理工具 Vault 快速入门
什么是 Vault Vault 是一个基于身份的秘密和加密管理系统.秘密是您想要严格控制访问的任何内容,例如 API 加密密钥.密码和证书. Vault 提供由身份验证和授权方法控制的加密服务.使用 ...
- 使用 JavaScript 脚本来进行复杂的查询改写
有这么一个需求: 网关里怎样对跨集群搜索进行支持的呢?我想实现: 输入的搜索请求是 lp:9200/index1/_search 这个索引在 3 个集群上,需要跨集群检索,也就是网关能否改成 lp:9 ...
- 极限科技旗下软件产品 INFINI Easysearch 通过统信 UOS 认证
近日,极限数据 (北京) 科技有限公司(以下简称:极限科技)旗下的软件 INFINI Easysearch 搜索引擎软件 V1.0 通过统信 UOS 服务器操作系统 V20 认证. 此次兼容适配基于统 ...
- SonarQube代码质量扫描工具
1.什么是SonarQube 既然是学习devops 运维流水线构建 开发 ↓ 测试 ↓ 运维 华为devops软件开发流水线文档 https://support.huaweicloud.com/re ...