C++ 头文件系列(stdexcept)】的更多相关文章

预定义异常类 这个头文件包含的内容非常简单,只包含9个异常类,均从exception类派生,因此我们用三张图来描述: 这里仅解释两点: overflow : 指值的大小超过 整型 变量能表示的范围,即小于最小值.大于最大值. underflow : 指浮点值的量级小于 浮点 变量能表示的最小量级,即太接近浮点数0,无法表示.…
注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous storage) 固定大小的(fixed-size) 那既然与内置数组一样,为什么还要定义这样一个模版呢?C++委员会是想造轮子吗(-_-)?当然不是! 为什么需要array? array模版类实际上是内置数组的聚合,外加一层封装.正是由于这层接口,才使得数组能与STL接轨,真正成为一个container.…
简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的不同是,它们是 容器适配器. 容器适配器 顾名思义,容器适配器是对容器的适配,从代码层面来讲,它就是对容器的再封装. 因此,这些容器适配器实际上都是由其他容器的功能实现的. 不难看出, 容器适配器所具有的功能是内部容器功能的子集. 普通的类封装一般是为了封装成特定问题领域下的类,提供特定的接口,以解…
简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-out): 后入栈的元素先出栈. 栈有两个典型的操作----入栈和出栈,一般来说我们认为这两个操作都发生在栈的顶端(top). 操作对应的函数 入栈 -> push 出栈 -> pop (没错,这个头文件的内容确实少)…
简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或者没有足够的理由使用其它容器,那么就用它,没错的! 从整体上来看,vector就像是一种动态数组,它拥有数组的所有功能并且能够动态增长. 它主要有以下性质: 序列性容器 动态增长 可定制的内存分配策略 内存分配器 如果在一些特殊的应用场景中,默认的内存分配策略拉低了运行效率,这时候自定义的内存分配其就会站出来…
简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性是: 映射关系 容器类别 既然说到关联性容器,自然得说说标准库的容器类别. C++库容器主要能分成以下几类: 序列性容器: 将存储对象组织成线性模型,使用户能够像线性数组那样存取. 关联性容器: 将存储内容以键(Key)相关联 ,通过键来存取内容. 乱序容器: 存储对象以乱序存储,不具有顺序. 容器…
简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash. 也是因为如此,你才可以在声明这些unordered模版类的时候,传入一个自定义的哈希函数,准确的说是哈希函数子(hash function object). 具有相同相同哈希值的元素被放在同一个桶(bucket)中. 为何乱序 在提供映射.集合功能的情况下,侧重于元素的快速获取. 用树结构(红黑…
简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a generalization of pointers that allow a C++ program to work with different data structures(containers) in a uniform manner. 上述文字摘自C++14标准草案,简而言之,迭代器就是对指针的一层封…
简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何数据结构都能使用这套算法库,只要它具有相应的迭代器类型. 算法类别 如上图所示,库中的算法主要分为4类: 非修改性顺序操作(Non-modifying sequence operations) 可变顺序操作(Mutating sequence operations) 排序和关系操作(Sorting…
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小. bitset是出于高效的空间利用为目的才出现的. 位操作 operator [] : 通过下标访问bit. count : 计数位值为1的位个数. size : 返回位的大小,即有多少个位. test : 测试下标指向的位值是否为1. any : 判断是否有任何一个位值为1. none : 判断…
简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板,黑框表示摸板实例): iosfwd 声明 该文件的全称是"input output stream forward",即输入输出流前向声明. 顾名思义,该头文件的主要目的就是为用户提供所有输入输出类的声明. 当你在某些只需要这些类声明,而不需要定义的地方(例如:自定义的头文件中),就可以简单…
1 简介 我们都知道,平时常用的那些标准流,诸如iostream.ofstream.ifstream等等,其实都是对应的basic_XXX模版的实例类. 而这些basic_XXX类模版又都是继承自同一个基类模版----basic_ios. 2 basic_ios模版 定义这个基类模版应该是出于可重用的目的. 2.1 成员类型 char_type : 字符类型,即第一个模版参数. char_traits : 萃取器,即第二个模版参数(默认为位于< string >头文件内的char_traits…
1. 简介 其实叫它istream有点不合适,因为该头文件不仅定义了istream,还定义了iostream. 2. basic_istream模版 basic_istream继承自basic_ios,也是其它输入流的基类. 2.1 sentry类 The class sentry defines a class that is responsible for doing exception safe prefix and suffix operations. sentry是哨兵的意思,标准给出…
1. 简介 该头文件定义了一些参数化的操纵器(manipulatators),注意ios头文件也定义了一些. 2. maniapulators 2.1 C++98 resetiosflags : 重置输入或输出流的格式化标记. setiosflags : 设置输入或输出流的格式化标价. setbase : 设置进制,支持8进制.10进制.16进制. setfill : 设置填充字符. setprecision : 设置浮点数的精度. setw : 设置字段宽度. 2.2 C++11 get_mo…
1. 简介 这个头文件非常特殊,它只声明了8个常用流对象. 2. 8个对象 2.1 窄字符对象(char) extern istream cin extern ostream cout extern ostream cerr extern ostream clog 2.2 宽字符对象(wchar_t) extern wistream wcin extern wostream wcout extern wostream wcerr extern wostream wclog 3 标准 -- 具体实…
1. 简介 头文件ostream主要定义了一个输出流类模版basic_ostream,该模版继承自basic_ios模版. 2. basic_ostream模版 2.1 sentry类 与basic_istream模版一样,basic_ostream也定义了一个sentry类,详见basic_istream::sentry. 2.2 流定位函数 seekp : 定位到指定位置. tellp : 返回当前位置. 2.3 格式化输出函数 operator <<(成员函数) : 输出变量,包括boo…
简介 头文件包含set.multiset两个类模版,这里要描述的概念与map非常相似,甚至连成员函数都几乎一样,所以这篇随笔会很短. set set如果翻译成中文应该是集合的意思,这里更确切的说是唯一有序集合,性质与map类似: 关联性 元素唯一性 动态增长 有序性 此外的一个重要特点是: Key与Value是同一个对象(自映射) set == map 定义使用set的时候只需要传入一个类型参数,这个类型即是key,也是value. 实际上,set是map的特殊情况,虽然set没有键值对这种元素…
1. 简介 该头文定义了与文件箱关联的流类的4个模版: basic_filebuf basic_ifstream basic_ofstream basic_fstream 和8个类型: filebuf ifstream ofstream fstream wfilebuf wifstream wofstream wfstream 2. basic_filebuf模版 该模版继承自basic_streambuf,同时将输入流与输出流与文件相关联,它的作用与basic_stringbuf是相似的. 因…
1.为什么system_error "....report error conditions originating from the operating system or low-level application program interfaces." 报告源于操作系统或低层程序接口的错误. 更进一步说,< system_error >提供了用于报告该方面错误的异常机制,是对<stdexcept>的扩展. 2.怎么用system_error 物以类聚,功…
简介 deque是double ended queue(即双端队列)的简称. 就像C++中的大部分容器的一样,deque具有以下属性: 顺序的(sequence) 动态增长的(dynamic growing) 自定义内存分配的(allocator-aware) 动态内存分配 容器的顺序性(或序列性)和内存分配器我们留到以后再说,这里我们先来探讨下容器的动态增长需求所带来的动态内存分配性质. 动态内存分配在这里的意思是容器的大小会随着需要而增长,这经常伴随着一些内存需求性的操作而发生(例如inse…
简介 forwrad_list字面意思为前向列表,但实际上它是一种单向列表,只能从单一方向遍历. 单向链表实现 forward_list内部是用单向列表实现的,并且设计该库的时候就是以近乎手写的单向链表的运行效率(时间上和空间上)为目的的. 这导致了它是唯一一个C++标准库容器中没有size成员函数的容器, 因为维护这样一个信息会造成效率上的轻微损失. 作为单向链表,它有以下几个属性: 潜在可能的非连续内存分配 线性时间的元素位置获取 常数时间的元素插入.删除.移动 与list的共性 因为它们的…
1. 简介 该头文件定义了basic_streambuf模版,从字面上看是作为流缓冲区之用. 2. basic_streambuf模版 The class template basic_stream< charT, traits > serves as an abstract base class for deriving various stream buffers whose objects each control two character sequences: -- a charac…
1. 简介 这个头文件主要定义了基于字符串类(string类)的流的4个模版: basic_stringbuf basic_istringstream basic_ostringstream basic_stringstream 和8个类型: istringstream ostringstream stringstream stringbuf wistringstream wostringstream wstringstream wstringbuf 2. basic_stringbuf模版 b…
测大小 这里我们比较4种版本的basic_string模版类,分别是:string, wstring, u16string, u32string. 虽然他们是不同的字符串类型,但是其sizeof的结果却一样,都为40字节(x64下): 看源码 我们都知道,上面4个不同的类型是同一份模版(basic_string)的实例化,因此它们的内存模型都是相同的. 这里我们来追踪一下string类型的源代码,源码引用VS2013版的标准string库. 看继承 看得出,basic_string的继承体系非常…
内容概览 一图解百问,但是有些地方我们需要特别指出: 类型在这里指通过typedef重定义的,例如函数类型.指针类型等. exception_ptr 在标准中是未定义具体实现的,因此它可能是类也可能是类型. uncaught_exception() 和 uncaught_exceptions() 是两个不同的函数,分别 判断是否有未处理异常.返回未处理异常的个数 . 其中,uncaught_exceptions()函数仅在C++14开始出现. 仔细观察上图,你就能发现标准库给我们提供了以下几个方…
简介 list实现的实际上是双向链表,所以叫它doubly-linked list也许更好. 因为实现的是双向链表,所以它有两个非常重要的性质: 双向 链表 双向 双向意味着----给定一个元素,我们能够知道后一个元素和前一个元素.而这在单项链表里是不可能实现的,因为单向链表只维护了单个方向的元素信息. 这种具体实现决定了,list的迭代器是双向迭代器(Bidirectional Iterator). 链表 优点 链表, 即 链▪表. 它暗示了链接的实质,也就是说,链表中的元素存储单元不一定是顺…
C++标准库的所有头文件都没有扩展名.C++标准库的内容总共在50个标准头文件中定义,其中18个提供了C库的功能. <cname>形式的标准头文件[ <complex>例外]其内容与ISO标准C包含的name.h头文件相同,但容纳了C++扩展的功能.在 <cname>形式标准的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明.在C++中还可以使用name.h形式的标准C库头文件名.C++标准库的内容分为10类:C1.语言支持 C2.输入/输出…
一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码. C++ 语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里..cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通…
该头文件的功能与系列3中的TOOLKIT.H类似,而且内容也几乎一致,所以也就不再详细介绍.…
//EPANET应用程序使用了大量的节点与管段数据,而且每个对象数据又有不同时段的数据,这些数据占用了大量内存,而mempool.h就是一个简单快速的内存分配相关的头文件/***  mempool.h****  Header for mempool.c****  The type alloc_handle_t provides an opaque reference to the**  alloc pool - only the alloc routines know its structure…