C++ STL开发温习与总结(五): 5.C++标准库简介

简介: C++ STL开发温习与总结(五): 5.C++标准库简介

原博主博客地址: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个类对象,他们分别是cincoutcerrclog,其中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

 


相关文章
|
6月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
167 2
|
6月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
318 73
|
6月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
256 3
|
7月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
318 1
|
7月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
83 0
|
3月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
164 0
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
161 12
|
6月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
123 16
|
7月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)