原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78138762
C++ STL开发温习与总结(五):
5.C++标准库简介
C++标准库很强大,在现在的情况下,C++标准库确实越大越好,因为大的库会包含大量的功能。标准库中的功能越多,开发自己的应用程序时能借助的功能就越多。C++库并非提供了一切(很明显是没有提供并发和图形用户接口的支持),但确实提供了很多。标准C++库中主要有一下主要组件:
* 标准C库。在C++标准库中包括了标准C库。
* I/O流技术。比传统I/O流更好,被模板化,增加了抛出异常。原来I/O流技术继续保留:流缓存区,格式化标识符,操作运算符和文件格式,还还支持cin,cout,cerr和clog对象。
* String。string对象在大多数应用中被用来消除对char *指针的使用。它们支持你所期望的那些操作,它们可以转换成char*,以保持和现有代码的兼容性,它们还会自动处理内存管理。一些string实现了引用技术,这回带来比基于char*的字符串更佳的性能。
* 容器。标准库提供了下列高效的实现:vector、list、queue、stack、deque、map、set和bitset。
* 算法。算法将容器的内容当作序列,每个算法可以应用于一个容器中所有制所对应的序列,或者一个子序列。标准算法有for_each、find、count_if、equal、search、copy、unique、rotate和sort,标准库中还包括其他很多算法。
* 对国际化的支持。C++库提供了很多特性有助于开发出国际化的软件。但虽然从概念上来说和C类似,其实C++的方法还是有所不同,例如,C++为支持国际化广泛使用了模版,还利用了继承和虚函数。
* 对数字处理的支持。C++库为复数类(实数和虚数部分的精度可以是float、double或long double)和专门针对数值编程而设计的特殊数组提供了模版。标准库还对两种不同类型的数组片提供了支持,并提供了算法计算内积。部分和、临差等。
* 诊断支持。标准库支持3中报错方式:C的断言、错误号、例外。
标准库中容器和算法这部分一般成为标准模版库。STL中实际上还有第三个构件-迭代器(iterator)。迭代器是指针似的对象,它让STL算法和容器共同工作。
1. C++标准库简介
标准库中东西很多,程序员所选择的类名或函数名很有可能和标准中的某个名字相同。为了避免这种情况所造成的名字冲突,实际上标准库中的一切都被放在了命令空间std中。但带来另一个问题,无数现有的C++代码都依赖于使用了多年的伪标准库中on个的功能。例如,声明在<iostream.h>、<complex.h>、<limits.h>等头文件中的功能。现在软件没有针对命令空间而进行设计。如果用std来包装标准库导致现有代码不能用。
为了解决上述问题,标准委员会报了std的那部分标准库构件创建了新的头文件名。生成新头文件的方法仅仅是将现有C++头文件中的.,h去掉,方法本身不重要。对于C头文件,将现有C++头文件中的.,h去掉并在每个名字前还要添加一个c,所以c的头文件<stdio.h>变成了<cstdio>。最后一点是,旧的C++头文件是官方所反对使用的,但旧的C头文件则没有。
以下是C++头文件的现状:
* 旧的C++头文件将继续被支持;
* 新的C++头文件包含的基本功能和对应的旧文件相同,但头文件的内容会在命令空间std中。(细节被修改,两处的实体不一定完全对应);
* 标准C头文件将继续被支持。
* 具备C库功能的新C++头文件具有如<cstdio>这样的名字,他们提供的内容和相应的旧C文件相同,只是内容在std中。
关于标准库,需要知道的第二点是,库中的一切几乎都是模版。I/O流技术帮助你操作字符流,字符可以是char、wchar_t、Unicode字符和一些其他的多字节字符,所以标准库让你去选择你想要的字符。所有的流类实际上是类模版,在实例化流类的时候指定字符类型。complex不是类,它是模版类:类型参数限定了每个complex类中实数部分和虚数部分的类型。同样vector也不是类,而是类模板。
1-1 I/O流技术
在C++语言中,数据的输入和输出包括:
输入:标准输入设备键盘、对在外存磁盘上的文件读取对内存中指定的字符串存储空间读取
输出:标准输出设备显示器、对在外存磁盘上的文件写入、对内存中指定的字符串存储空间读取。
对标准输入设备和标准输出设备的输入输出简称为标准I/O,在对外存储磁盘上的文件的输入输出简称为文件I/O,对内存中鼎的字符串存储空间的输入输出简称为串I/O。
C++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios、istream、ostream、iostream、ifstream、ofstream、fstream、istrstream、ostrstream、strstream等,其中ios为根基类,其余都是它的直接或间接派生类。
iso为根基类,它直接派生4个类:输入流类istream,输出流类ostream,文件流基类fstreambase和字符串流基类strstreambase。
输入文件流类ifstream同时继承了输入流类和文件流基类;
输出文件流类ofstream同时继承了输出流类和文件流基类;
输入字符串流类istrstream同时继承了输入流类和字符串流基类;
输出字符串流类ostrstream同时继承了输出流类和字符串流基类;
输入输出I/O流类技术iostream同时继承了输入流类和输出流类;
输入输出文件流类fstream同时继承了输入输出流类和字符串流基类。
输入输出字符串类strstrem同时继承了输入输出流类和字符串流类。
C++流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存)输入和从内存向外部输出设备(如显示器和磁盘)输出的过程,这种输入输出过程被形象地比喻为流。
C++系统中的I/O流类库,其所有类被包含在iostream.h、fstream.h和strstrea.h这三个系统头文件中。
* iostream.h包含有:ios、iostream、isteam、ostream、iostream_withassign、istream_withassign和ostream_withassign等。
* fstream.h包含有:fstream、ifstream、ofstream、fstreambase以及iostream.h中的所有类。
* strstrea.h包含有:strstream、istrstream、ostrstream、strstreambase以及iostream.h中的所有类。
在一个程序或一个编译单元(即一个程序文件)中当需要进行标准I/O操作时,则必须包含头文件iostream.h,当需要进行文件I/O操作时,则必须包含头文件fstream,h,当需要进行串I/O时,则必须包含头文件strstrea.h。
当系统编译一个C++文件对#include命令进行处理时,是把该名字中指定的文件中的全部内容嵌入到该命令的位置,然后再编译整个C++文件生成相应的目标代码文件。
C++不仅定义有现成的I/O流类库供用户使用,而且还为用户进行标准I/O操作定义了4个类对象,他们分别是cin、cout、cerr和clog,其中cin为istream_withassign流类的对象,代表标准输入设备键盘,也称为cin流或标准数如流,后3个为ostream_withassign流类的对象,cout代表标准输出设备显示器,也成为cout或标准输出流,cerr和clog含义相同,均代表错误信息输出设备显示器。因此当即你想那个键盘输入时使用cin流,当进行显示器输出时使用cout流,当进行错误信息输出时使用cerr或clog。
在istream输入流类中定义有对有操作符>>重载的一组公用成员函数
istream& operator >> (简单类型标识符&)
简单类型标识符可以为:
字符型:char、signed char、unsigned char、
短整型:short、unsigned short、
整型:int、unsigned int、
长整型:long、unsigned long、
浮点型: float、double、long double、
字符指针型:char *、signed char*、unsigned char*
当系统执行cin>>x操作时,将根据实参x的类型调用相应的提取操作符重载函数,把x引用传递给对应的形参,接着从键盘的输入中读入一个值并赋值给x(因形参是x的别名)后,返回cin流,一边继续使用提取操作符为下一个变量输入数据。
从键盘上输入数据时,只有当输入完整数据并按下回车键后,系统才把该行数据存入到键盘缓冲区,供cin流顺序读取给变量。从键盘上输入的每个数据之间必须用空格或回车符分开,因为cin为一个变量读入数据时,是以空格或回车符作为其结束标志的。
当cin>>x操作中的x为字符指针类型时,则要求从键盘的输入中读取一个字符串,并把它赋值给x所指向的存储空间中,若x没有事先指向一个允许写入信息的存储空间,则无法完成输入操作。另外从键盘上输入的字符串,其两边不能带有双引号定界符,若带有只作为双引号字符看待。对于输入的字符也是如此,不能带有单引号定界符。
在ostream输入流类中定义有对左操作符<<重载的一组公用成员函数,函数的具体声明格式为:
ostream& operator << (简单类型标识符&)
该处的简单类型标识符比cin增加了一个void*类型,用于输出任何指针(但不能是字符指针,因为他将被作为字符串处理)。
当系统执行cin<<x操作时,首先根据x值的类型调用相应的插入操作符重载函数,把x的值按照值传递给对应的形参,接着执行函数体,把x的值(形参的值)输入到显示器屏幕上,从当前屏幕光标位置起显示出来,然后返回cout流,以便继续使用插入操作符输出下一个表达式的值。当使用插入操作符向一个流输出一个值后,再输出下一个值时将被进阶着放在上一个值的后面,所以为了让流中前后两个值分开,中间可添加其他分隔字符。
1-2 string类
string对象在大多数应用中被用来消除对char*指针的引用。它们支持你所期望的那些操作,它们可以转换成char*,以保持和现有代码的兼容性,它们还自动处理内存管理。一些string的实现采用了引用计数,这会带来比基于char*的字符串更佳的性能。
现在大多数的编译器都已实现了C++标准的std::string类,为了使用该类,需要包含头文件<string>。
1-3标准异常类
本质上看,程序异常是指出现了一些很少发生的或出乎意料的状态,通常显示了一个程序错误或要求一个必须提供的回应。如果不能满足这个回应则会经常造成程序功能削弱或死忙,有时导致整个系统和它一起奔溃。
C/C++标准增加了一个基本上不可见的“异常体系”到语言中。
标准C提供了几个异常管理机制,这些在标准C++也可用。相关的头文件为<cname>。
在执行语句float *x = new float[n];时,如果计算机不能分配足够的空间怎么办?在这种情况下,new不能分配所需数量的存储空间,将会引发一个异常。在C++中,当new不能分配足够的空间时,它会引发一个异常xalloc(在except.h中定义)。可以采用try-catch结构来不活(catch)new所引发的异常。
float *x; try { x = new float [n]; } catch( xalloc ) { // 仅当new失败时才会进入 cerr<< “Out of Memory” << endl; exit(1); }
在C++程序中处理错误条件的常用方法就是每当检测到这样的条件时就引发一个异常。当一个异常被引发时,必须指明它的类型。语法catch(…)定义了一个能捕获所有有异常的catch块。但是如果找不到一个异常的catch块程序将显示信息“Abnormal program termination(异常程序终结)”并终止运行。
1-4标准模版库类
STL是Standard Template Library,译为标准模版库。从根本上说,STL是一些“容器”的集合,这些“容器”有list、vector、set、map等,STL也是算法、迭代器和其他一些组件的集合。STL的目标是标准化组件,和Visual C++中的ATL概念类似。
STL现在已经是C++的一部分,因此不用额外安装,它被内建在支持C++的编译器之内。
STL主要由迭代器、算法、容器、函数对象、内存分配器和配接器等6大部分组成,由于其中的代码采用模版类及模板函数的方式,可以极大地提高编程效率。
STL倡导新的编程风格—泛型编程,即以通用的方式来写算法和数据结构。
原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78138762