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的更多相关文章

  1. [c++] STL = Standard Template Library

    How many people give up, because of YOU. Continue... 先实践,最后需要总结. 1. 数据流中的数据按照一定的格式<T>提取 ------ ...

  2. C++ Standard Template Library STL(undone)

    目录 . C++标准模版库(Standard Template Library STL) . C++ STL容器 . C++ STL 顺序性容器 . C++ STL 关联式容器 . C++ STL 容 ...

  3. C++ Standard Template Library (STL) 高级容器

    更多 STL 数据结构请阅读 NOIp 数据结构专题总结(STL structure 章节) std::map Definition: template < class Key, // map: ...

  4. <Standard Template Library>标准模板库专项复习总结(二)

    4.队列 先进先出(FIFO)表 头文件:#include<queue> 变量的定义:queue<TYPE>queueName 成员函数: bool empty() 空队列返回 ...

  5. <Standard Template Library>标准模板库专项复习总结(一)

    看了看博客园的申请时间也一年多了...想想自己一年多以来一直处于各种划水状态,现在又要面临ACM的冲击... 还是要抓紧时间赶紧复习一下了- -毕竟校园新生赛还是有奖金的.. 1.栈 先进后出(LIF ...

  6. EL and JSTL(Jsp Standard Tag Libary)(转)

    一.什么是 EL 语言. 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语音. 二.EL 语言的作用. 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAS ...

  7. 标准差standard deviation和标准错误standard error你能解释一下

    by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...

  8. 对于随机变量的标准差standard deviation、样本标准差sample standard deviation、标准误差standard error的解释

    参考:http://blog.csdn.net/ysuncn/article/details/1749729

  9. 剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题

    一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如 ...

  10. MNI模板和Talairach 模板的对比

    The MNI brain and the Talairach atlas SPM 96 and later use standard brains from the Montreal Neurolo ...

随机推荐

  1. RocketMQ的单节点环境搭建

    1 介绍RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 1.1 RocketMQ 特点支持发布/订阅(Pub/Sub)和 ...

  2. 我对IdentityServer4的初步了解

    官网:https://identityserver4.readthedocs.io/en/latest/quickstarts/2_interactive_aspnetcore.html 官网例子:h ...

  3. django多表关联实战

    定义模型类: from django.db import models from django.contrib.auth.models import User ''' ---------- Djang ...

  4. QShop商城-快速开始-uni-app小程序

    QShop商城-快速开始-uni-app小程序 工具准备 HBuilderX 此项目为UniApp开发,开发工具为HBuilderX,下载地址: https://hx.dcloud.net.cn/Tu ...

  5. MVCC(多版本并发控制)详解

    在 MySQL InnoDB存储引擎下,RC.RR 基于 MVCC 进行并发事务控制, MVCC 是基于"数据版本"对并发事务进行访问 用一个例子来解释一下,下面是一张事务执行流程 ...

  6. js 留言板(带删除功能)

    本文所用的知识点:创建节点和添加节点 创建节点:document.createElement('li') 添加节点  node(父亲节点).appendChild(child)    child:子节 ...

  7. Qt下载、安装及环境搭建

    1  下载 刚开始去的官网下载,需要注册账号,而且还比较麻烦,后来找到了一个安装包的链接,直接下载就好了:http://mirrors.ustc.edu.cn/qtproject/archive/qt ...

  8. idea mapper xml 文件报红

    在使用 idea 打开 mapper 文件,出现一下报红错误: 可以看到数据表和字段都是红色的. 解决方案 打开设置,window版本是打开Settings: 找到 Languages & F ...

  9. Wakeup Source框架设计与实现

    Wakeup Source 为系统组件提供了投票机制,以便低功耗子系统判断当前是否可以进入休眠. Wakeup Source(后简称:WS) 模块可与内核中的其他模块或者上层服务交互,并最终体现在对睡 ...

  10. Nodejs中间件 中间件分类和自定义中间件

    中间件 中间件理解 中间件可以理解为业务流程的中间处理环节.如生活中吃一般炒青菜,大约分为如下几步骤 express中当一个请求到达的服务器之后,可以在给客户响应之前连续调用多个中间件,来对本次请求和 ...