C++编程思想第二卷(实用编程技术)摘要

在c++编程思想的第二卷中介绍了很多更深入的c++特性,这是现代C++编程的精髓

模板

1.一般类的声明和定义都在H和CPP两种文件中,主要是怕连接时的多重定义,但是对于模板可以放心的将他们都放在H文件中,因为template后面的东西编译器不会为其分配空间,知道有一个模板实例告知。如果不适用内敛的方式,在每次定义模板的函数前都要声明template,而且声明中的类名后面要加<参数>

2.可以这样定义模板类

template<class T,classu…>

template<class T,int size…>

template<class T,int size=100…>//一个默认值

定义函数模板

template<class T,classu…> void f();

template<typename T…> void f();

在使用函数模板时通产个可以省略模板参数(在可以推断出来的时候)

可以这样定义成员函数模板:在类的内部,定义一个函数template<class T,classu…> void f();这个甚至可以是构造函数。

3关键字typename:表示他限定的那个词是一个类型(类内的)而不是一个成员:typename Seq<T>::iterator it;如果不加这个关键字,那么编译器会认为iterator是成员,有语法错误,加上后表示这是一个类型,而it是一个变量。同样template关键字也只能用在模板类中,这个关键字表示他后面出现的那个<为模板参数列表符而不是小于号。

4.模板的特化

全特化:

template <class Window, class Controller>
class Widget
{
... generic implementation ...
};

template <>
class Widget<ModalDialog, MyController>
{
... specialized implementation ...
};
其中 ModalDialog 和 MyController 时定义好的classes,在这里当你构建Widget<ModalDialog, MyController>实例时,将用下面的构造函数,而其他的用上面的,上面的称泛化,下面的叫特化

偏特化:就是部分参数特化,部分泛化

template <class Window> // Window
class Widget<Window, MyController> // MyController
{
... partially specialized implementation ...
};

这里window是范化的,MyController是特化的,也就是构造一个任意类和MyController的实例时调用这个构造函数

这个构造可以很复杂,泛化的类可以也是一个模板类

template <class ButtonArg>
class Widget<Button<ButtonArg>, MyController>
{
... further specialized implementation ...
};

5.局部类:

也就是定义在函数中的类,这个类不能定义static成员变量,也不能存取non-static的局部变量

void Fun()
{
class Local
{
... member variables ...
... member function definitions ...
};
... code using Local ...
}

函数不能偏特化

 

异常处理

1.捕获所有异常使用catch(...)

2重新像更高一级跑出异常要在catch子句中写一个throw

3、不捕获异常,如果异常没有被任意一个层次捕捉到,那么就睡直接调用程序中的terminate函数,它的默认实现是abort(),这不是一个正常终止程序的方式,全局变量不被析构

可以使用set_terminate来设置自己的terminate函数。

4、标准异常类:exception,他有很多派生类提供各种异常,可以查阅

5异常规格说明:void f();可能跑出各种异常void f() throw(a,b..);理论上只抛出这些异常;void f()throw();理论上不抛出任何异常;

如果程序抛出了不在描述中的异常,那么会调用unexpected()函数,默认下这个函数执行terminate函数,可以使用set_unexpected()来重新设置这个函数。

函数对象:

他是实现了重载()的类的一个实例。

在stl的算法中,这个类的实例通常被用来作为判定函数,它并不是函数,但是因为他重载了(),可以调用a(),类似于一个函数,所以叫做函数对象,它比简单的判定函数的好处在于它是一个类的对象,它里面可以存储更多的信息

在通用算法中,算法有几元,它的判定函数就必须使用几元,算法的元是指它传递到判定函数中的参数的个数。

STL算法:

1、填充和生成:fill() fill_n() generate()

2、计数:count() count_if()

3、操作序列: copy() copy_backward() reserve()[倒置] reserve_copy()[倒置后复制它出] rotate()【交换位置】rotate_copyright()

                      next/preve_permutation()[数学上的排列组合] rondom_shuffle()【随机重排】 partition()[划分,将满足某个条件的元素移到开头]

4、查找和替换: find/findif()[线性查找] adjacent_find()[查找两个临近的相等元素] find_first_of()[在第二个序列上查找与第一个序列上某个元素相等的元素]

                        search()[查找第二个序列是否出现在第一个序列中(次序也一致)] find_end()[同serch,但是返回最后出现的那一段位置]

                        search_n()[查找一组相邻的同样的值] min/max_element()[找到最小/大的那个值首次出现的位置] replace()replace_if()replace_copy_if()[找到后替换]

5、比较范围:equal()【两个范围是否元素相同顺序相同】lexicographical_compare()[比较两个范围的字典编纂顺序]

6、删除元素:remove() remove_if() remove_copy_if()

                    unique()[删除相邻的同样的元素(相邻的值留下一个),通常之前先用sort(),这样可以每个元素都只有一个]

7、排序合并:sort()[按升序排序] stable_sort()[按升序排序并保持相等元素的顺序] partitial_sort()【部分排序】nth_element()[保证其中一个元素作为划分点,左侧小于它,右侧大于他,用

               于算中值和百分点] binary_serach()[在已排序的范围内寻找] upper_bound()[在一个范围内找出大于一个值的元素最后出现的那个位置]

               equal_range()【找到在一个范围内某只出现的范围】merge() inplace_merge()[合并]

                在已拍好序的集合上的集合运算

                     include()【是否包含】set_union/differrence/intersection/symmetric_difference()

8、堆运算:通常可以将一个序列转化成一种类似于对的结构,在这里面便于一次找出优先权最高的元素

                make_heap()[将序列转化成堆]push_heap() pop_heap()[将堆顶的元素一道序列的最尾断,不是移除]sort_heap()【将一个堆序的序列重新变成一个按顺序排列的序列】

9、对一个范围的成员全部应用某种运算;foreach()【对每个成员使用某个函数】transforma()【对每个成员使用某个函数并把结果写入一个序列】

10、数值算法:accumulate()【对所有元素循环的调用一个函数得到一个累计的值】inner_product()【内积】partitial_sum()adjacent_diffrence()[得到原数列相邻元素的差]

11、其他:pair():一个封装两个对象的类,通过make_pair()构造

                distance():返回两个迭代器之间的距离,增加次数

                back_inserter/inserter/front_inseeter():为一个容器构建一个迭代器,这个迭代器只用于在某个位置进行插入

                min() max() [比较]  swap()[值交换]

容器:
容期间可以通过assign进行互相的转换
vector:它可以快速的访问,但支不持在中间插入,它溢出时的代价很高,因为先要分配更大的存储空间,然后把原先的内容拷贝过来。可以使用reserved告知预先要多大的空间,而使一个整数作为它的构造函数的第一个参数的做法则是把所有的成员默认初始化。
使用vector的最有效的方法是,在开始使用reserved告诉预先需要的空间大小,然后只在序列后端插入或删除元素
deque:在不确定对象数量时尽量用它而不用vector,因为它在两端插入或删除的效率更高。但是随机访问不如vector。它不支持中间插入。
list:在任意地方插入删除,但是不支持随机访问,只能遍历,遍历效率也较慢。如果是较大较多的对象,尤其是构造很麻烦的对象,尽量使用它,如果要进行排序等更是的,因为在list中这通常只需要改变指针的指向而已。

适配器:stack、queue、prioruty_queue为适配器,他们是用vector、list和dequeue来实现的,每一个适配器都可以用它们分别实现。它们的默认方式通常被认为是最好的。
prioruty_queue:出于安全,它没有设计迭代器,但是可以使用mack_heap等操作讲vector模拟成优先队列。
关联式容器:set/multyset/map/multymap都是,它们的特点是将一个值关联一个关键字,set可看成只有关键字。
set:存放唯一的且排过序的成员。

表示二进制位:
c中没有表示二进制数值的方法,只有十进制和十六进制,有两个方法可以代替。
bitset类:它表示有固定位数的二进制串。

vector<bool>容器

valarray容器,他可以操纵一组数组,然后进行各种数值运算,可以对其中的一部分切片出来分析。

时间: 2024-11-01 19:53:46

C++编程思想第二卷(实用编程技术)摘要的相关文章

java语言学习002_面向对象编程思想

      人类在认识世界时,为了方便自己和智慧提升,很自然的对事物进行了分类.对世界进行了抽象,若把所有各个事物看做对象,纵观所有对象,这些对象具有各自的或共有的特征,并且又有共有的或各自的的能力,这样就可以对具有相同一些特征和一些能力的事物进行了归类.       比如,车,有汽车,火车他们都有哪些属性?                  汽车,特征:长度,颜色,速度,轮胎,载重,平面行走--能力:移动,载东西,--                  火车,特征:长度,颜色,速度,轮胎,载重

java编程思想-java编程四线第二十一章 线程SynchronizationComparisons.java有错误

问题描述 java编程四线第二十一章 线程SynchronizationComparisons.java有错误 //BaseLine 和AtomicTest 是线程不安全的 ,求解答 //: concurrency/SynchronizationComparisons.java// Comparing the performance of explicit Locks// and Atomics versus the synchronized keyword.import java.util.c

JAVA编程思想 课程进展 一

编程 第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此.如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序

Web2.0编程思想:16条法则_web2.0

1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像"我需要保存一个书签"或者"我准备帮助人们创建可编辑的.共享的页面"这样的目标,让你保持最基础的需求.很多Web 2.0应用的最初吸引之处就是它的简单,避免并隐藏了那些多余的复杂性.站在创建者的立场,可以想象Google的几乎没有内容的主页,还有del.icio.us的简单的线条.从最终用户的角度来看,与之齐名的就是Diggdot.us所提供的初始化页面.

C++编程思想1

学了好久的 C++了 发现自己对于C/C++还是没有深入的了解 于是 咬咬牙啃起了 C++编程思想 希望能有所感悟 .. 我以前是直接学C++的对于C不是很了解,然而又是在VC下 学习 所以 没有好好的 去学习 标准C++,直到我 看起C++编程思想  我发现真应该从头再学一遍了  ...   1.定义的声明的区别  : 声明是 声明了标示符的存在 并没有为 其分配空间   ,而定义 是为其分配的一定的存储空间 int * p ;//这是对指针的声明 并且定义 int p;//这是对整形变量的声

简述AngularJS相关的一些编程思想

  这篇文章主要介绍了AngularJS相关的一些编程思想,AngularJS是一款热门的JavaScript库,推荐!需要的朋友可以参考下 在过去的几个月里,我一直遨游于Angular的世界.如今回想起来,很难想象在没有类似于Angular.js, Backbone.js以及其伙伴Underscore.js这些数据绑定框架下我每天如何去编写一个大型前端应用.我不敢相信我已经用它们完成了那件工作. 可能我有点小偏见,但考虑到我一直在做的应用是在浏览器中实现Photoshop类型的编辑器,它呈现相

android-怎么形成编程思想,写代码的时候不知道该干什么

问题描述 怎么形成编程思想,写代码的时候不知道该干什么 最近在看视频学Android,可以看懂视频中的大多数代码,但是让我自己写就有点难了,写完这一步不知道下一步该干什么,甚至是根本不知道该怎么下手,请问怎么才能形成编程思想啊,写不出来就很烦 解决方案 无论是使用什么编程语言,你首先需要确定需求,即功能的定义. 自己用纸来写出整个流程,当然用 Visio 等工具也可以,编程只是个实现的过程,编程用的语言只是个工具.如果你都不清楚想要做什么,和怎么去做,那使用什么编程语言都是一样的. 解决方案二:

学习JAVA编程思想4的好方法

问题描述 跪求大神总结学习JAVA编程思想4的好方法. 解决方案 解决方案二:Java编程思想是很好的学习Java的材料,但对初学者来说有的地方不是能够轻易明白的.因为Java涉及的概念和技术非常广泛,建议先把基础夯实,比如类,接口,继承,多态等,这些有了基础后可以再深入学习正则表达式.线程.io等,一定要动手编写代码,并确实明白代码的执行逻辑.解决方案三:1.背把那些死知识背下来,复习巩固2.敲可以按书本例子课后题敲,对没掌握的可以重复敲3.测找其他题测试掌握情况,最好找SCJP题库的题,因为

C# 4.0新特性-&quot;协变&quot;与&quot;逆变&quot;以及背后的编程思想

在<上篇>中我们揭示了"缺省参数"的本质,现在我们接着来谈谈C#4.0中另一个重要的新特性:协变(Covariance)与逆变(Contravariance).对于协变与逆变,大家肯定不会感到陌生,但是我相信有很多人不能很清晰地说出他们之间的区别.我希望通过这篇文章能够让读者更加深刻的认识协变与逆变.但是也不排除另一种可能,那就是读者这篇文章你对这两个概念更加模糊.文章一些内容仅代表个人观点,如有不妥,还望指正. 目录 一.两个概念:强类型与弱类型 二.委托中的协变与逆变的