不要重复发明轮子-C++STL

闫常友 著. 中国铁道出版社. 2013/5


标准的C++模板库,是算法和其他一些标准组件的集合。 .

1.类模板简介

2.c++中的字符串

3.容器

4.c++中的算法

5.迭代器

6.STL 数值计算

7.输入输出流

8.异常

9.工具

10.语言

11.检测库

12.国际化

13.仿函数

14.配置器


一讲,

变量的地址称为 指针 。 如果有一个变量用来存储别一变量的地址,称为指针变量。

指针算术 和 内部处理数组的方式 , 指针变量 增加减少1 之后 , 增加的量等于指向的类型的字节数。

数组名解释为第一个元素的地址。  动态分配 会导致内存泄漏。

全局变量说明符 extern , 如果外部变量 不在开头定义 , 作用范围只限定义到文件尾,函数引用 之前用extern 作 外部变量声明 。

static 希望函数中的局部变量的值 在函数调用结束后不消失  ,可以用static 声明该局部变量 。

编译 得到 的是二进制目标代码 , 检查语法错误 ,是可重定位的程序模块。链接 生成可执行文件。

使用类模板的静态成员。、必须在类外部声明 ,

成员模板  模板可用做结构、类 或模板类的成员。

友元模板  友元机制允许一个类将对非公有的访问权 授予 指定的函数 或类。friend

函数模板

关键字typename 的使用  : typename 告诉编译器 其后的名称为一个类型, 用来创建实例。

模板库 STL 主要有三类: algorithm,container,iterator.

c++中STL 分13个头文件, algorithm,deque,functional,iterator,vecotr,list,map,memory,numeric,queue,set,stack,utility.

STL可分为    容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adaptors)、算法(algorithms)、仿函数(functors)六个部分。

STL 内所有组件都由模板构成,元素可以是任意型,组件中主要是窗口,迭代器,算法和仿函数。


二讲,字符串

string 是以 结尾的char 数组 。 可以复制,赋值,比较。

智能指针 是一个类,可以提高内存使用效率

大小和容量 : size() = length() .  max_size()返回字符最大可能个数.  capacity()重新分配之前的字符容量.  reserve().预留容量.

元素访问: [] 和 at() . [] 不检查索引有效性, 是有效的. at() 会检查下标. 都返回字串的引用.  最后一字符索引为length-1.

比较: compare () . > < ==  >= <= != 

修改替换: assign()  operator=  erase()  swap()  insert() append()  replace()

字符串连接 : operator+  

字串IO :  operator<<  operator>>

字串搜索: npos是一个无符号整数值,初始-1. find() rfind()   find_last_of()  find_first_of().   find_first_not_of()  find_last_not_of(). 

迭代器支持:理解迭代器是STL关键所在.  输入迭代,输出迭代,正向迭代,双向迭代,随机访问迭代. string类使用随机存取迭代器.

使用迭代器的例子str.begin()   end() , rbegin(),rend()  构造器, 

配置器  为窗口开辟内存. 按对象,


三讲,容器

在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。

经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。

向量(vector) 连续存储的元素<vector>

列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list>

双队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque>

集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>

多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>

(stack) 后进先出的值的排列 <stack>

队列(queue) 先进先出的执的排列 <queue>

优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>

映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>

多重映射(multimap) 允许键对有相等的次序的映射 <map>

STL容器成员  可复制/可指派/可释放 

STL容器分为  序列式容器 vector 动态数组 deque双向队 list单向队 ,关联性容器 set map multiset multimap hash table ,容器接配器 stack queue proority_queue .

#pragma warning (disable:XXXX)  清除警告信息

vector 类: 元素可以是任何类型. 最简单的序列式容器, 可随机访问, 可当作动态数组使用. 

vector 基础成员函数 : push_back()   size() capacity() max_size() reserve() empty()    clear()

vector 查找 : find() find_if() 

vector 插入元素 : push_back() insert()

vector 元素排序: sort()

vector 删除: pop_back()  erase() clear() remove()

vecotr对象交换: swap()

list 类由双向链表实现的, 不支持随机存取.不提供下标和at()操作. 没有容量空间分配函数.移除元素比使用算法更快.

list 赋值: push_front() push_back() pop_front()   pop_back();

list 容量: resize() size() max_size()

list 迭代: begin() front() rbegin() end() back() rend()

list 基础成员函数: empty()  assign() 元素重置, swap() ,  insert() .

list 运算符:  ==     <   !=  <=  >   >=   

list 合并排序 :     merge()    sort()  remove()   remove_if()    splice() 合并 ,  unique() 移除重复元素  reverse() 倒序排列

deque 双端队   采用动态数组来管理元素,重要特征是随机存取,且在两端插入删除是高效的. 代价是 中间插入非常费力的.存取比vector稍慢,deque使用多块内存,

deque 容量 : size()   max_size()  resize() 

deque 赋值 : push_front() push_back() pop_front() pop_back()  operator[] 访问任意元素       =   赋值.    六个运算符

deque 迭代器 : begin rbegin end rend back front   空 empty()    元素at() 重围assign()   交换swap() 

deque 插入删除: insert()  erase()   clear()     没有查找函数 要用算法中的.

set/multiset  关联容器,最常见最有用, 能顺序存储数值,  集合元素即当数据又当键码. 升序存储. set 不能包含重复元素,multiset可以

set 6种创建方法;

set 具有排序功能 ,

set/multiset : size()  empty() max_size()  个数统计count()  find()  low_bound() upper_bound() equal_range()

set/multiset :迭代相关,  swap()  , insert()   erase() 

set/multiset 比较:  key_comp() 键比较 value_comp() 值比较

map/multimap 键值对 ,通常理解为关联数组. 可用键作下标取值. 键值独立.multimap 允许重复元素 , map不允许 .

map/multimap 五种构造

map/multimap 排序准则 : 模板参数定义 , 构造函数参数定义

map/multimap : size() max_size()   empty()    迭代器 begin()   end() rbegin() rend()

map/multimap 高级编程: inset() erase()  clear() swap()  count()  find()

map/multimap 元素大小 比较,   key_omp()   value_comp()  6个运算符,   获取内存分配器 get_allocator()

通常 string 可视为容器,其元素均为字符. 

可以通过数组指针, 对数组使用STL算法.

bitset 类模板

stack 类模板

queue类模板

proority queues 类模板


四讲,算法

算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。

<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

<functional>中则定义了一些模板类,用以声明函数对象

for_each算法  :

for_each(Iterator begin,iterator end, process op);

元素计数算法:

count(Iterator begin,Iterator end,const T& value);

最值算法

Iterator min_element(Iterator beg,Iterator end);

Iterator min_element(Iterator begin,iterator end,compFunc op);

搜寻算法

Iterator find_if (Iterator begin,Iterator end,UnaryPredicate op);

Iterator find(Ierator begin,Iterator end,const T& value);

区间比较算法

equal()  mismatch() lexicographical_compare()

复制

copy()  copy_backward()

转换

transform()

互换

swap()

赋值

fill()   generate()   fill_n()  generate_n() 

替换

replace()

逆转

reverse()   reverse_copy()

旋转

rotate()  rotate_copy()

排列

全部元素排序

sort()  stable_sort()

局部排序

partial_sort()  partial_sort_copy()

指定元素排序

nth_element()

堆操作

make_heap()   push_heap()  pop_heap()  sort_heap() 

合并排序

merge()   union()   intersection() difference() inplace_merge()

搜索

binary_search()   includes()  lower_bound() equal_range() upper_bound()

删除算法

remove()  remove_if() remove_copy() remove_copy_if() 


第五话,迭代器

输入输出型迭代器

前向迭代器 双向 随机

插入型 流迭代器 ostream istream

辅助函数 advance() 前进函数 。distance() 处理距离。iter_swap()交换内容。


第六话,数值计算。

slice 切割 ,

通用数值计算   求和accumulate 内积ineer_product 部分和partial_sum 


第七话,输入输出流

Stream 对象.

endl:  功能有一是输出 二是刷新缓冲区.     ends:       flush:   刷新output缓冲区  ws :读入并省略空格

IOStream 基本类和对象 .

头文件:iosfwd ,streambuf,istream,ostream iostream 

标准Stream操作符:

Stream 状态:

标准输入输出函数: get() getline()  read() readsome()   put() write() flush() 

格式化

StreamBuffer类

Stream缓冲区:

缓冲区迭代器:

自定义缓冲区:

基于字符串的流

streambuf类

类模板basic_istringstream

类模板basic_ostringstream

类模板basic_stringstream

基于文件的流

文件标志: ios_base ,

随机存取:

要实现文件的写入,有如下步骤:

1. 创建一个ofstream对象管理输出流。

2.该对象与特定的文件绑定

3.使用cout方式使用对象,区别是输出到文件而不再是屏幕。

实现文件读取也要有3个步骤:

1.创建一个ifstream对象,管理输入流

2. 此对象与文件关联

3.使用cin方式使用此对象。

4个类模板:basic_filebuf , basic_ifstream, basic_ofstream, basic_fstream

c库提供的文件存取: <cstdio>中的宏,

streamBuffer 类为缓冲区管理内存,

自定义缓冲区:

eback(),eptr(),egptr() 返回的指针构成 了read(input)缓冲构的界面 。pbase(),pptr(),epptr()返回的指针构成了write(output)缓冲区的接口。

overflow().

基于字符串的流

std::ios:: binary 打开二进制文件。而 UNIX 中二进制文件和文本文件没有区别。


第八话,异常处理

logic_error a("exception: loci_error.");
runtime_error b("exception:runtime_error.");
domain_error c("exception:domain_error.");
invalid_argument d("excepton:inavlid_argument.");
length_error e("exception:length_error.");
range_error f("exception:range_error.");
overflow_error g("excption:overflow_error.");
underflow_error h("exception:underflow_error.");
out_of_range i("exception:out_of_range_error.");

读过 聊斋志异 古文观止  孟子 庄子  

没读过  左传 国语 战国策 史记  资质

abort();

exit();


第九话,通用工具

  味道    我们何以分辨 ?

动态内存管理 

堆的内存分配  全局存储区/自由存储区/堆     运算符new 从堆中分配 存储器,delete返回给堆。要捕获 堆耗尽 异常。

stddef    cstdlib

时间  是很复杂的概念  UTC  GMT

模板类 auto_ptr 

…… 花舌!



第十话,语言支持

_cdecl     __cdecl 是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。

~size_t   "int"可以是负   "size_t"只是正   "size_t" == "unsigned int" :  

throw bad_alloc();


11话, 检测库

assertions , 影响性能


12话,国际化库

locale 


13,仿函数

就是定义了一个operator()对象,可视为一般函数,不同的是,仿函数功能是在其成员函数operator()中实现的。仿函数都包含成员函数 operator() 。

1.比一般函数灵巧,拥有状态。  2.每个仿函数有型别,可作模板参数  3.仿函数比函数执行速度快很多。地址调用方法效率低。

3个概念: 生成器 = 无参仿函数,一元函数,二元函数。


14话,配置器

allocator . 用来管理对象内存的.

新海诚作品     言叶之庭     秒速五厘米     追逐繁星的孩子

原文地址:https://www.cnblogs.com/iamgoodman/p/3202492.html