19.1 C++STL标准模板库大局观-STL总述、发展史、组成与数据结构谈

19.1 C++STL标准模板库大局观-STL总述、发展史、组成与数据结构谈
19.2 C++STL标准模板库大局观-容器分类与array、vector容器精解
19.3 C++STL标准模板库大局观-容器的说明和简单应用例续
19.4 C++STL标准模板库大局观-分配器简介、使用与工作原理说
19.5 C++STL标准模板库大局观-迭代器的概念和分类
19.6 C++STL标准模板库大局观-算法简介、内部处理与使用范例
19.7 C++STL标准模板库大局观-函数对象回顾、系统函数对象与范例
19.8 C++STL标准模板库大局观-适配器概念、分类、范例与总结

1.STL总述、发展史、组成与数据结构谈

  1.1 几个概念与推荐书籍

(1)C++标准库

    英文名字是C++Standard Library。一般来讲,只要安装了C++编译器(如Visual Studio ),那么,这些标准库都会被安装进来,这样就可以在程序中使用这些标准库里提供的各种功能。例如已经很熟悉的vector容器等,都是标准库里面提供的。标准库帮助开发者解决了可复用的问题,许多功能不用程序员自己去实现,标准库就已经提供出来了。所以用好标准库中提供的常用功能对于成为一名合格的C++程序员也是必不可少的。

(2)标准模板库

    这个词相信很多读者都熟悉,英文名字是StandardTemplateLibrary(STL)。包含在C++标准库之中,作为C++标准库的一个重要组成部分或者说是C++标准库的核心,深深影响着标准库。

(3)泛型编程

    英文名字是Generic Programming。
    所谓泛型编程,是使用模板(Template)为主要的编程手段来编写代码(模板在前面已经详细学习过)。
    其实,模板编程这种手段编写的代码会让很多人不习惯——代码冗长晦涩,但是这种手段编写的代码也能实现一些匪夷所思的功能,与面向对象程序设计的代码书写方式很不一样。
    可以认为,标准模板库就是用泛型编程的编码方式所写的一套供程序员非常方便使用的库。

(4)推荐书籍

    《C++标准库》是一本比较权威的书籍,但是总体有1000多页,笔者觉得可以概览,当成一本字典在需要时查阅是非常不错的。但要是从头到尾详细研读,反而太花时间,事倍功半。
    还有一本侯捷老师的《STL源码剖析》

  1.2 算法和数据结构谈

    为什么要提起“算法和数据结构”这个话题呢?和本章要讲解的STL有什么关系吗?有关系,STL库里面的具体实现就会用到算法和数据结构领域的一些知识,如会用到树、散列表(哈希表)之类的数据结构知识,所以很多人都有一个疑惑:要不要把算法和数据结构的知识好好学一学?
    这是一个非常典型的问题,笔者这里根据自己的经验尝试解答,供读者参考。

(1)数据结构浅谈

    数据结构研究的是什么呢?是用来研究数据怎么存,怎么取的一门学问。也许有人问,数据存取还有学问吗?当然有学问,有各种各样的数据结构,如栈、队列、链表、散列表、树、图等。这么多种不同的数据结构,有的存数据速度非常快,有的取数据速度非常快,有的查询特定数据速度非常快,每种数据结构都有不同的优势和劣势,需要根据具体的使用场景来决定到底采用什么样的数据结构。当然,这些具体数据结构也是通过书写具体的代码来实现的。

(2)数据结构的学习方法

    不管是否学习过数据结构方面的知识,笔者要求读者对数据结构有一个简单的认识,不需要知道太多,但是,栈、队列、链表这三种数据结构还是需要大概知道是什么。如果不懂,可以通过搜索引擎进行搜索,找到一些相关的实现代码作为参考和借鉴来了解这些基本概念。
    (1):后进先出,后放进来的数据,取的时候先取。
    (2)队列:先进先出
    (3)链表:像个大链一样,每个链上的节点长的都很类似,多个节点链(串)在一起。每个节点都有数据部分以及一个next指针(next指针用来指向链上的下一个节点,链上最后一个节点的next指针指向NULL)

(3)推荐书籍

    《算法导论》,对于真正需要这本书的人,其价值自现。但是笔者还是那句话:不到万不得已,不要去啃这种书,事倍功半。

  1.3 STL发展史和各个版本

    STL在1998年被融入C++标准中,里面大量用到了泛型编程,写的代码非常复杂难懂,而且每次升级,代码的复杂度都会明显更上一个台阶。当然也有人说代码写得很精妙,从源码书写角度来讲,让人又爱又恨,从使用者角度来讲,却是一个极好的东西,因为里面包含大量现成的功能供程序员使用。
其实STL的实现有很多版本,例如:
  (1)HPSTL:惠普STL,是所有STL实现版本的始祖。
  (2)SGISTL:参考惠普STL实现出来,Linux下的GNU C++(gcc、g++)用的就是这个。
  (3)P.J.Plauger STL:参考惠普STL实现出来,Visual C++(包括笔者所用的Visual Studio 2019中的C++开发环境)一般使用这个(打开iostream文件在底下能看到P.J.Plauger字样)。

  1.4 标准库的使用说明

    C++标准库的所有标识符都定义在std这个命名空间内,所以一般往往会在一个.cpp源文件前面加入下面这行代码,相信读者都已经很熟悉了:

using namespace std;

    标准库中包含很多的头文件,其中和STL相关的头文件有几十上百个(不同的STL版本的文件数目不同)。在使用STL的时候,也需要把这些头文件包含到自己的项目中来,现代版本标准库中的头文件名字,已经把.h扩展名去掉,变成了没有扩展名的头文件。例如:

#include <iostream>
#include <string>

  1.5 STL的组成部分

    C++标准库非常庞大,而标准模板库STL作为C++标准库的重要组成部分是本章讲解的核心内容。
    在介绍细节之前,有必要对STL的组成部分做一个大概说明,因为很多程序员确实在用STL,但对STL的组成部分并不清楚。STL的组成划分为如下几个部分。

(1)容器

    最常用的vector、map、list等。前面详细讲解过vector容器。

(2)迭代器

    用于遍历或者说访问容器中的元素。前面也详细讲解过迭代器,类似一个指针,迭代器一般服务于容器。多数情况下,每种容器也都会提供适合自己的迭代器。

(3)算法

    算法可以理解成STL提供的一些函数,用来实现一些功能,例如查找用到search,排序用到sort,复制用到copy等。这种算法大概也有数十上百个,是否常用取决于具体项目和程序员的开发习惯。

(4)分配器

    分配器一般不太常用。前面在内存高级话题学习到内存池时,说到内存池存在的主要意义是针对频繁分配小块内存时,减少内存空间的浪费,并有一定的提升分配内存效率的作用。所以,分配器也有这个作用,只不过一般来讲使用的都是默认分配器,不需要程序员明确指定。这里谈的分配器应该叫作内存分配器,是服务于容器的。当在main主函数中输入vector<int,的时候,自动出现一些提示,提示中的_Alloc=allocator…字样就是分配器

(5)其他

    例如一些适配器、仿函数(函数对象)等,把这些统一归为“其他”这个分类即可。也没必要分得太细,后续笔者会选择性地做演示。
    本节从总体上介绍了一下STL,以便对STL有一个整体的印象。从下一节开始,具体学习STL的各个组成部分,先从容器学起。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值