c++ 标准模板库,C的标准库
c强大的功能来源于其丰富的类库和库函数资源。C标准库的内容定义在50个标准头文件中。在C语言的开发中,应该尽量使用标准库。这样做的直接好处包括:(1)成本:已经作为标准提供了,何必花费时间和人力重新开发;(2)质量:所有标准库都经过严格测试,保证正确性;(3)效率:人的效率已经体现在成本上,代码执行的效率要建立在实现标准库的大牛们的水平上;(4)良好的编程风格:采用业内通用的做法进行开发。
在C程序设计课程中,尤其是作为第一门程序设计课程,我们注重语法、语言机制等方面。编程能力的培养是一个过程,跨越基础原理知识直接进入工程是惯例,因为跨度决定了它的难度。再者,在掌握基本原理的基础上,对标准库的理解问题,可以凭借实践逐步掌握。标准库的学习不需要认真看书,需要了解大致情况,在实践中深化。
这个任务是了解C编程课程中没有提到,但对编程很重要的内容。至少我们应该能先回答“那里有什么”这个问题。
国际标准图书馆
C标准库的内容分为10类,分别是(建议标出你在阅读中用过或听说过的头文件):
C1。标准库中与语言支持功能相关的头文件
支持程序启动和终止的宏和函数。这个头文件还声明了许多其他的函数,比如搜索和排序函数、将字符串转换成数值的函数等等。与相应的标准C头文件stdlib.h不同,它定义了abort(void)。abort()函数有额外的功能。它不调用静态或自动对象的析构函数,也不调用传递给atexit()函数的函数。它还定义了exit()函数的额外函数,可以释放静态对象,并按照与注册相反的顺序调用用atexit()注册的函数。并关闭所有打开的C流,将控制权交还给宿主环境。
接受可变数量参数的函数。也就是说,当调用一个函数时,可以向该函数发送许多数据项。它定义了宏va_arg、va_end、va_start和va_list类型。
它支持标准流cin、cout、cerr和clog的输入和输出,还支持多字节字符标准流wcin、wcout、wcerr和wclog。
定义重载的关系运算符,以简化关系运算符的编写。它还定义了pair type,这是一种可以存储一对值的模板类型。这些函数在库中的其他地方使用。
定义了许多类型的函数对象和支持函数对象的函数,函数对象是任何支持operator()()函数调用运算符的对象。
提供对字符串类型的支持和定义,包括单字节字符串(由char组成)和多字节字符串(由wchar_t组成)
提供处理非空字节序列和内存块的函数。这不同于相应的标准C库头文件。C风格字符串的几个常用C库函数被返回值为const和非常数的函数对代替。
提供用于处理、执行I/O和转换多字节字符序列的函数,这不同于相应的标准C库头文件。由多字节C样式字符串操作的几个通用C库函数被返回值为const和non-const的函数对替换。
定义vector sequence模板,这是一种大小可以重置的数组类型。它比普通阵列更安全、更灵活。
Map是一个关联的容器类型,它允许根据键值是唯一的,并按升序存储。Multimap类似于map,但是键不是唯一的。
Set是一种关联容器类型,用于按升序存储唯一值。Multiset类似于set,但是值不必是唯一的。
C标准库的所有头文件都没有扩展名。c标准库以cname格式作为标准头文件提供。在cname正式标准的头文件中,与宏相关的名字都是在全局范围内定义的,其他名字都是在std命名空间中声明的。也可以使用标准的C库头文件名称,形式为C中的name.h。
二。标准模板库STL介绍[1]
STL(标准模板库)是惠普实验室开发的一系列软件的总称。不过主要出现在C中,不过这种技术在引入C之前已经存在很久了。
从广义上讲,STL代码可以分为三类:算法、容器和迭代器。几乎所有的代码都采用了模板类和模板函数,与传统的由函数和类组成的库相比,提供了更好的代码重用机会。在C标准中,STL被组织成以下13个头文件:算法、队列、函数、迭代器、向量、列表、映射、内存、数值、队列、集合、堆栈和实用程序。
1.算法
函数库中数据类型的选择对其可重用性起着至关重要的作用。例如,当浮点数用作其参数类型时,找到其根的函数的可重用性肯定比整数用作其参数类时高。c,通过模板机制,允许推迟选择某些类型,直到它真正想要使用或专门化模板。STL利用了这一点,提供了相当多有用的算法。它在一个有效的框架内完成了这些算法。——可以把所有的类型分成几类,然后在模板的参数中用一种类型替换同一类中的其他类型。
STL提供了大约100个模板函数来实现算法。比如_each的算法会对指定序列中的每个元素调用指定的函数,stable_sort会根据你指定的规则对序列进行稳定排序等等。这样,只要熟悉STL,很多代码都可以大大简化,只需要调用一两个算法模板,就可以完成所需的功能,效率大大提高。
该算法主要由头文件算法、数值算法和函数算法组成。算法是所有STL头文件中最大的(虽然很好理解)。它是由大量的模板函数组成的,可以认为每个函数在很大程度上是独立的。其中,常用的函数范围涉及比较、交换、搜索、遍历操作、复制、修改、删除、倒置、排序、合并等。Numeric很小,只包括几个对序列进行简单数学运算的模板函数,包括对序列的一些加法和乘法的运算。Functional定义了一些模板类来声明函数对象。
2.容器
在实际开发过程中,数据结构本身的重要性并不逊于算法对数据结构的操作的重要性。当程序中有需要大量时间的部分时,数据结构的选择就变得更加重要。
经典数据结构的数量有限,但我们经常重复编写一些代码来实现向量、链表等结构。这些代码非常相似,但在细节上有所不同,以适应不同数据的变化。STL容器为我们提供了这样的便利。它允许我们重用现有的实现来在特定类型下构造我们自己的数据结构。通过设置一些模板类,STL容器为最常用的数据结构提供了支持。这些模板的参数允许我们指定容器中元素的数据类型,这可以简化许多重复而繁琐的任务。
容器主要由头文件Vector、List、Deque、Set、Map、Stack和queue组成。对于一些常用的容器和容器适配器(可以看作是其他容器实现的容器),它们与对应头文件的对应关系可以总结如下表。
由节点组成的红黑树,每个节点包含一个元素,节点由作用于该对元素的一些谓词来排列。没有两个不同的元素可以有相同的顺序。
3.迭代程序
迭代器是函数中最基础的部分,但是要比前两个更费功夫去理解。软件设计有一个基本原则。通过引入一个间接层,所有问题都可以简化。这种简化是由STL中的迭代器完成的。一般来说,在STL中使用迭代器来链接算法和容器,它起到了一种粘合剂的作用。STL提供的几乎所有算法都是通过迭代器访问元素序列来工作的。每个容器都定义了自己的迭代器来访问容器中的元素。
迭代器主要由头文件工具、迭代器和内存组成。Utility是一个非常小的头文件,它包含了STL中使用的几个模板的声明。迭代器提供了很多迭代器使用的方法,但是描述内存非常困难。它以一种不寻常的方式为容器中的元素分配存储空间,还为一些算法执行期间生成的临时对象提供了一种机制。内存的主要部分是模板类分配器,它负责在所有容器中生成默认分配器。
三。附言
关于STL的使用也有两种观点。第一种认为STL最大的作用是作为经典的数据结构和算法教材,因为它的源代码涉及到很多具体的实现问题。第二是STL的初衷是简化设计,避免重复劳动,提高编程效率,所以应该是“应用优先”,没有必要去钻研源代码。对于初学者来说,通过分析源代码来提高对其应用的理解具有重要意义。
曾经想过设计几道计算机题,让学生体验用STL编程。写一个适合初学者的题目,规模不能太大,又要有足够的指导性,真的是一件费时费力的事情。况且还有其他事情要紧急处理,这笔账我先欠着,以后再说。给同学们的建议是,很多经典的C教材对STL都有非常好的解释,可以选一本来读。阅读时要开始学会挑跳,而不是从头到尾,一页一页的读。在这个阶段,你可以先学习iterator utility,C编程中建议替换数组的向量,实现双向链表的list。Vector和list似乎与本周的任务1和任务2有关。再者,要发扬一贯能练的精神,及时找一些题目或者自制的题目进行练习。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。