闫常友 著. 中国铁道出版社. 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 是以\0 结尾的char 数组 。 可以复制,赋值,比较。

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

 

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

元素访问: [] 和 at() . [] 不检查索引有效性,\0 是有效的. 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:  功能有一是输出 \n 二是刷新缓冲区.     ends:  \0     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 . 用来管理对象内存的.

 

 

 

 

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

不要重复发明轮子-C++STL的更多相关文章

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。

    1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...

  3. 第27篇 重复造轮子---模拟IIS服务器

    在写程序的时候,重复造轮子是程序员的一个大忌,很多人对重复造轮子持有反对的态度,但是我觉得这个造轮子的过程,是对于现有的知识的一个深入的探索的过程,虽然我们不可能把轮子造的那么的完善,对于现在有的东西 ...

  4. 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...

  5. Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写(全部用POSIX C实现)

    Light libraries是一组通用的C基础库,目标是为减少重复造轮子而写实现了日志.原子操作.哈希字典.红黑树.动态库加载.线程.锁操作.配置文件.os适配层.事件驱动.工作队列.RPC.IPC ...

  6. 重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关

    重复造轮子系列——基于Ocelot实现类似支付宝接口模式的网关 引言 重复造轮子系列是自己平时的一些总结.有的轮子依赖社区提供的轮子为基础,这里把使用过程的一些觉得有意思的做个分享.有些思路或者方法在 ...

  7. 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印

    重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印 一.引言 桌面端系统经常需要对接各种硬件设备,比如扫描器.读卡器.打印机等. 这里介绍下桌面端 ...

  8. Meteva——让预报检验不再重复造轮子

    更多精彩,请点击上方蓝字关注我们! 检验是什么?****预报准确率的客观表达 说到天气预报,你最先会想到什么? 早上听了预报,带了一天伞却没下一滴雨的调侃? 还是 "蓝天白云晴空万里突然暴风 ...

  9. Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子。加快开发速度

    Android Studio 如何导出和导入自己的常用设置,避免重复制造轮子.加快开发速度 作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 在使用 A ...

随机推荐

  1. SpringMVC第二天

    SpringMVC第二天   框架课程 1. 课程计划 1.高级参数绑定 a) 数组类型的参数绑定 b) List类型的绑定 2.@RequestMapping注解的使用 3.Controller方法 ...

  2. PostgreSQL的索引选型

    PostgreSQL里面给全文检索或者模糊查询加索引提速的时候,一般会有两个选项,一个是GIST类型,一个是GIN类型,官网给出的参考如下: There are substantial perform ...

  3. linux下方便的录屏命令

    linux下方便的录屏命令   ffmpeg -f x11grab -s 1024*768 -r 20 -i :0.0 -sameq ~/recode.mpg -r后是刷新屏率,   推出直接Ctrl ...

  4. ubuntu 14 编译ARM g2o-20160424

    1. 安装eigen sudo apt-get install libeigen3-dev sudo apt-get install libsuitesparse-dev sudo apt-get i ...

  5. c语言学习笔记 switch case语句为什么要加break

    先来看一个没有break的例子: int main() { int a = 1; switch (a) { case 1: printf("1"); case 2: printf( ...

  6. Django框架 之 querySet详解

    Django框架 之 querySet详解 浏览目录 可切片 可迭代 惰性查询 缓存机制 exists()与iterator()方法 QuerySet 可切片 使用Python 的切片语法来限制查询集 ...

  7. SpringMVC——概述

    Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 Spring MV ...

  8. Java 集合工具类---------- Collections类

  9. Sharepoint2013搜索学习笔记之设置外网内容源(四)

    第一步,进入管理中心,点击管理应用程序,点击search service 应用程序进入到搜索管理配置页面,选择内容源 第二步,点击新建内容源,给内容源命名,在爬网内容类型中选网站,在爬网设置中选中仅对 ...

  10. 手机打车APP的机遇与挑战

    所谓打车APP,就是个能安装在手机上的打车软件.原理是通过GPS进行定位,能够搜索附近的空车信息然后反馈给用户.同样的,空车信息也会反馈给用户.一般这种啊APP都是跟地图类软件一起的.比如百度地图,谷 ...