• 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  // STL's vector
     2 #include 
     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必需导入这个头文件;

      第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 
     2 #include  // 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,必需导入这个头文件;

      第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的第一个和最后一个元素,下面是以先前的vectorivec为例,示范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内部的元素全部显示到屏幕上;

     

  • 相关阅读:
    uni-app——項目day01
    特征融合与特征交互的区别
    Python性能测试服务器进程资源消耗
    考虑车轮纵向滑动的无人自行车平衡控制实现
    mysql高手进阶优化篇
    R语言绘制时间序列的偏自相关函数图:使用pacf函数可视化时间序列数据的偏自相关系数图、分析是否存在自相关性以及显著相关的个数
    机器学习(18)---朴素贝叶斯
    通用/参考电路/ 连接备份
    考研信息管理系统
    openmp 通用核心 学习 2 数据环境—任务-内存模型
  • 原文地址:https://www.cnblogs.com/ruanchunyi/p/18314124