自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 收藏
  • 关注

转载 Givens变换

摘抄自《数值线性代数(徐树方)》Givens变换是一种将n维向量x在第(i,k)两个维度确定的坐标平面内进行旋转(从而将其中一个分量化0)的变换,因此它又叫平面旋转变换。与Householder变换将一个向量中的若干个分量化0相比,Givens变换将向量的其中一个分量化0。本篇先介绍Givens变换的定义及其性质,再推导一种用于求Givens变换的数值化方法一、Given...

2018-09-17 21:22:00 14358

转载 Householder变换

整理自:《数值线性代数(徐树方)》Householder变换是一种能将n维向量x变换到任一n维向量y的正交变换,由于从几何上看Householder变换通过x和y之间的垂直平分面将x“反射”到y,因此Householder变换又叫镜面变换;Householder的主要应用在于它能够将x变换成任意一个等长的若干个分量为0的向量(这种向量具有某些良好的性质,尤其是在最小二乘法的正交化...

2018-09-08 16:17:00 4666

转载 C++ 11: function,bind和lambda表达式

1. 自由变量(free variable)和闭包(closure) "Incomputer programming, the term free variablerefers tovariablesused in afunctionthat are neitherlocal variablesnorparametersof that function....

2015-12-16 22:25:00 338

转载 C++:IO缓冲区

1. C++每一个流对象都维护一个缓冲区,缓冲区本质上是一个用于存储输入和输出序列的字符数组,并通过三个指针(begin_pointer,next_pointer,end_pointer)描述,缓冲区按刷新类型分为全缓冲,行缓冲和无缓冲.(具体见《C++ 输入输出流与本地化》)2. 常用的缓冲区函数函数作用int peek()...

2015-10-29 01:03:00 204

转载 主定理

(摘自《算法导论》)主定理: 若T(n)由递归式T(n)=aT(n/b)+f(n)对非负整数定义,其中a≥1,b>1为常数,f(n)为一函数,则:\[T(n) = \left\{ \begin{array}{l}\Theta ({n^{{{\log }_b}a}}),\exists \varepsilon > 0,f(n) = O({n^{{{\log }...

2015-10-28 13:06:00 199

转载 8086寄存器和7种寻址方式

1. 8086处理器有以下寄存器:类别位数名称通用16AX, BX, CX, DX8AH,AL,BH,BL,CH,CL,DH,DL指针16SP(stack pointer,堆栈指针),BP(...

2015-10-19 22:06:00 802

转载 More Effective C++ 条款35 让自己习惯于标准C++ 语言

(由于本书出版于1996年,因此当时的新特性现在来说可能已经习以为常,但现在重新了解反而会起到了解C++变迁的作用)1. 1990年后C++的重要改变 1). 增加了新的语言特性:RTTI,namespaces,bool,关键词mutable和explicit,enums作为重载函数之自变量所引发的类型晋升转换,以及"在class 定义区内直接为整数型(intergral)...

2015-10-14 21:48:00 156

转载 More Effective C++ 条款34 如何在一个程序中结合C++和C

1. C++和C混合使用的前提之一就是编译器产生兼容的目标文件(.lib和.dll等).所谓"兼容",指的是编译器在"预编译器相依的特性上"一致,如int和double大小,参数压栈机制等,只有在这个基础上才能讨论结合使用C++和C模块的问题.2. 在1的基础上,要结合使用C++和C的模块,主要有以下几点需要注意: 1). name mangling(名称重整) ...

2015-10-14 21:15:00 239

转载 More Effective C++ 条款33 将非尾端(non-leaf classes)设计为抽象类(abstract classes)

1. 假如程序有一个Chicken class,Lizard class,Animal class,其中Chicken class和Lizard class继承自Animal class,整个继承体系像这样: Animal负责具体化所有东吴的共同特征,Lizard和Chicken是需要特殊对待的两种动物,它们的简化定义像这样:class Animal {pu...

2015-10-13 22:09:00 189

转载 More Effective C++ 条款32 在未来时态下发展程序

1. 所谓"在未来时态下发展程序",指的是是程序需要具有良好的可扩展性和可维护性,它要求程序:功能齐全,接口易用,代码泛化,以下原则有助于实现这一目标: 1). 以C++本身表现各种规范而不是仅仅依赖于注释:如果某个class不打算作为基类,那么就应该以C++语法阻止派生(条款26);如果一个class要求所有对象实体在heap内产生,就以C++语法严格厉行这项约束(条款27)...

2015-10-13 20:48:00 165

转载 C++:IO标志位

(部分摘自《标准C++输入输出流与本地化》)1. 状态标志. 1). 每个流对象都维护一个状态变量标记流状态(成功或失败),该变量类型是iostate(实际上是ios_base定义的位域类型),状态变量的不同二进制位用来标记不同状态,共有三个状态标志:状态标志作用所占bitfailbit出现可挽回的...

2015-10-13 19:53:00 829

转载 More Effective C++ 条款31 让函数根据一个以上的对象类型来决定如何虚化

1. 假设要编写一个发生在太空的游戏,其中有飞船(spaceship),太空站(space station)和小行星(ssteroid),使它们继承自一个抽象基类GameObject,整个继承体系像这样:class GameObject { ... };class SpaceShip: public GameObject { ... };class SpaceSt...

2015-10-13 01:04:00 166

转载 定点数表示方法——原码,补码,反码,移码

1. 真值和机器数 真值:数的实际值,用正负号和绝对值的某进制形式来表示,如+1010,-12,-FFFF等. 机器数:真值在计算机中的二进制表示,特点是符号数字化且数的大小受机器字长限制,其表示形式有原码,补码,反码,移码等.2. 原码. 1). 定点小数:\[{x_{[{\rm{原}}]}} = \left\{ {\begin{array}{*{...

2015-10-10 00:39:00 4358

转载 More Effective C++ 条款30 Proxy classes(替身类,代理类)

1. 所谓代理类(proxy class),指的是"它的每一个对象都是为了其他对象而存在的,就像是其他对象的代理人一般".某些情况下用代理类取代某些内置类型可以实现独特的功能,因为可以为代理类定义成员函数而但却无法对内置类型定义操作.条款5就展示了一个使用代理类阻止隐式类型转换的例子.2. 实现二维数组. C++没有提供分配动态二维数组的语法,因此常常需要定义一些类(模板实...

2015-10-09 14:47:00 250

转载 More Effective C++ 条款29 Reference counting(引用计数)

1. reference counting使得多个等值对象可以共享同一实值,这样不仅简化了heap objects的簿记工作,便于管理内存,而且能够节省空间,提升效率.以下讨论以自实现的String为例.2. Reference Counting(引用计数)的实现 基本设计像这样:class String {public: ...private...

2015-10-07 18:55:00 262

转载 More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节.2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment ...

2015-10-06 22:31:00 239

转载 More Effective C++ 条款27 要求(禁止)对象产生与heap之中

1. 要求对象产生于堆中 由于non-heap 对象会在定义时自动构造,并在寿命结束时自动析构,因此要阻止客户产生non-heap对象,只需要将构造或析构函数声明为private.又由于构造函数可能有多个,儿媳够函数只有一个,因此更好的选择是将析构函数声明为private,然后开放一接口调用它,像这样:class UPNumber {public: U...

2015-10-06 12:23:00 155

转载 More Effective C++ 条款26 限制某个class所能产生的对象数量

1. 针对某些有特殊功能的类,有时需要限制其对象数量,例如系统中只有一个打印机,因此需要将打印机的对象数目限制为1,或者只有16个file descriptor(文件描述器)可用,因此必须确定不会有更多的descriptor objects被产生出来,在这些情况下.就需要限制对象数目,或者说阻止对象被产生出来.2. 允许零个或一个对象 要限制对象数目,最直接的策略是限制构造...

2015-10-06 01:00:00 168

转载 C/C++:对象/变量初始化相关

一、 直接初始化和复制初始化 1.定义:直接初始化使用"( )"符号,如:string s("hello");复制初始化使用"="符号,如:string s="hello". 2.区别:对于内置类型,直接初始化和复制初始化没有差别:其操作都是"提供一个值,并且把这个值复制到新定义的对象中"(《C++ Primer》). 对于类类型,直接初始化根据参数类型调用...

2015-09-28 02:23:00 172

转载 More Effective C++ 条款25 将constructor和non-member function虚化

1. Virtual constructor 原则上构造函数不能为虚:虚函数用于实现"因类型而异的行为",也就是根据指针或引用所绑定对象的动态类型而调用不同实体,但构造函数用于构造对象,在对象构造之前自然没有动态类型的概念,虚与非虚也就无从谈起.所谓的的virtual-constructor实际上是"仿virtual-constructor",它本质上不是constructor...

2015-09-26 22:04:00 105

转载 More Effective C++ 条款24 了解virtual function,multiple inheritance,virtual base classes,runtime type id...

1. 要实现C++的每一个语言特性,不同的编译器可能采取不同的方法,其中某些特性(如标题所列)的实现可能会对对象的大小和其member functions的执行速度带来冲击.2. 虚函数. 当通过对象指针或引用调用虚函数时,具体调用哪一个虚函数由指针或引用的动态类型决定,大部分编译器使用vtbls(virtual tables,虚函数表)和vptrs(virtual tab...

2015-09-26 12:59:00 237

转载 More Effective C++ 条款23 考虑使用其他程序库

1. "理想的程序库应该小,快速,威力强大,富有弹性,有扩展性,直观,可广泛运用,有良好支持,使用时没有束缚,而且没有'臭虫'".但实际上这种程序库是不可能实现的:要针对速度和大小做优化,往往要牺牲移植性;要有丰富的机能,结果可能不够直观......一个程序库往往要权衡各方面得失,采取折中的方法来实现.2. 不同的程序库侧重点可能不一样,即使两个程序库机能类似,也可能有不同的性能表现...

2015-09-25 23:41:00 118

转载 More Effective C++ 条款22 考虑以操作符复合形式(op=)取代其独身形式(op)

1. 一般来说,重载了算数操作符(以下称"独身形式"),那么也就要重载复合赋值操作符(以下称"复合形式").要确保操作符的复合形式例如(operator+=)和独身形式(例如operator+)行为相一致,基于前者实现后者是一个好方法.例如:class Rational{public: Rational operator+=(const Rational&amp...

2015-09-25 20:31:00 174

转载 More Effective C++ 条款21 利用重载技术避免隐式类型转换

1. 正如条款19和条款20所言,临时对象的构造和析构会增加程序的运行成本,因此有必要采取措施尽量避免临时对象的产生.条款20介绍了一种用于消除函数返回对象而产生临时对象的方法——RVO,但它并不能解决隐式类型转换所产生的临时对象成本问题.在某些情况下,可以考虑利用重载技术避免隐式类型转换.2. 考虑以下类UPInt类用于处理高精度整数:class UPInt{pub...

2015-09-24 21:40:00 122

转载 More Effective C++ 条款20 协助完成"返回值优化(RVO)"

1. 函数如果返回对象,就会产生临时对象(见条款19)的构造,析构等过程,考虑以下重载的operator*:class Rational{public: int getNumerator(){return numerator;} int getDenomerator(){return denominator;} Rational(int ...

2015-09-24 21:01:00 261

转载 More Effective C++ 条款19 了解临时对象的来源

1. 所谓的C++临时对象并不是程序员创建的用于存储临时值的对象,而是指编译器层面上的临时对象:这种临时对象不是由程序员创建,而是由编译器为了实现某些功能(例如函数返回,类型转换等)而创建. 由于临时对象不是由程序员创建,其生存期由编译器掌控,因而也就不允许程序员对其进行更改,将其绑定到non-const 左值引用也就被禁止(见C++ 11: 右值引用,转移语义与完美转发),所...

2015-09-23 22:11:00 126

转载 More Effective C++ 条款18 分期摊还预期的成本

1. Over-eager evaluation("超急评估"):超前进度地做"要求以外"的更多工作,也就是在要求之前就把事情做下去.例如,以下class template用于表现数值数据的大型收集中心:template<class NumericalType>class DataCollection{public: NumericalType ...

2015-09-23 21:14:00 128

转载 More Effective C++ 条款17 考虑使用lazy evaluation(缓式评估)

1. lazy evaluationg实际上是"拖延战术":延缓运算直到运算结果被需要为止.如果运算结果一直不被需要,运算也就不被执行,从而提高了效率.所谓的运算结果不被执行,有时指只有部分运算结果被需要,那么采用拖延战术,便可避免另一部分不被需要的运算,从而提高效率,以下是lazy evaluation的四种用途.2. Reference Counting(引用计数) 如...

2015-09-22 22:17:00 176

转载 More Effective C++ 条款16 谨记80-20法则

1. 80-20法则:一个程序80%的资源用于20%的代码上(80%的执行时间华仔大约20%的代码身上,80%的内存被大约20%的代码使用,80%的磁盘访问动作由20%的代码执行,80%的维护力气花在20%的代码上面).80-20法则的重点不在于字面上的数字,而是强调"软件的整体性能几乎总是由其构成要素(代码)的一小部分决定".2. 80-20法则说明软件性能的瓶颈往往只在一小部分代...

2015-09-22 20:37:00 114

转载 More Effective C++ 条款15 了解异常处理(exception handling)的成本

1. 为了支持运行期处理exception,编译器需要做大量的簿记工作:确认如果发生异常所需要析构的对象,记录每个try语句块对应的catch子句及其能够处理的exception类型等.编译器还需要在运行期做一些对比工作:在exception抛出时适当析构对象并找出正确的catch子句等.可见exception的使用需要大量成本. "即使从未使用任何exception处理机制"...

2015-09-22 19:45:00 161

转载 More Effective C++ 条款14 明智运用exception specifications

1. Exception specifications作为函数声明的一部分,用于指出(并不能限制)函数可能会抛出的异常函数.C++规定,一个拥有exceptionspecification的函数指针只能被赋予一个有着相同或更为局限的exceptionspecification的函数地址,因而编译器要保证"在函数指针传递之际检验exception specifications".(但v...

2015-09-21 23:19:00 180

转载 Effective C++ 条款55 让自己熟悉Boost

1. Boost是一个C++开发者集结的社群,也是一个可自由下载的C++程序库群,它的网址是http://Boost.org.C++组织和网站有很多,但Boost有两个特性是其他组织无可匹敌的:第一,Boost由C++标准委员会成员创设,因此和C++标准委员会之间有着独一无二的密切关系,作为一个"可被加入标准C++之各种功能"的测试场是Boost的目标之一,实际上,以TR1(见条款54)...

2015-09-13 12:58:00 119

转载 Effective C++ 条款54 让自己熟悉包括TR1在内的标准程序库

1. TR1(Technical Report 1)是C++ 03标准的一个扩展,它并不属于C++ 03标准,只是一份草稿文件,用于指出下一版C++标准很可能吸收的特性.目前,它的大部分已被C++ 11采纳,成为官方标准.2. C++ 98列出的标准库的组成: STL(Standard Template Library,标准模板库).包含容器,迭代器,算法,函数对象,各种容...

2015-09-13 10:53:00 146

转载 Effective C++ 条款53 不要轻忽编译器的警告

1. 编译器的警告可能给出很重要的信息,例如:class B{public: virtual void f() const; ...};class D:public B{public: virtual void f(); ...}; 由于B中的f是const成员函数,而D中的f是非const,因此D::f是...

2015-09-13 09:52:00 98

转载 Effective C++ 条款52 写了placement new也要写placment delete

1. placement new和place ment delete指的是正常的operator new和operator delete的重载版本,所谓的正常的operator new和delete,指的是拥有以下正常签名式的版本:void* operator new(std::size_t) throw(std::bad_alloc);void operator del...

2015-09-13 02:10:00 187

转载 Effective C++ 条款51 编写new和delete时需固守常规

1. 实现定制的operator new和operator delete需要满足一定的要求. 以operator new而言:实现一致性operator new必须返回正确的值;内存不足时必得调用new-handling函数;必须有对付零内存需求的准备;需避免不慎掩盖正常形式的new;如果有能力供应客户申请的内存,就返回一个指针指向该内存,反之就遵循条款49的规则并抛出bad_...

2015-09-13 01:11:00 132

转载 Effective C++ 条款50 了解new和delete的合理替换时机

1. 替换标准库提供的operator new或operator delete通常基于以下三个理由: 1). 用来检测运行上的错误.将"new 所得内存"delete掉却不幸失败会导致内存泄露,多次对同一块"new所得内存"施行delete会导致未定义行为,如果让operator new持有一串动态分配所得地址,而operator delete将地址从中移走,就可以很容易检测出...

2015-09-13 00:02:00 110

转载 Effective C++ 条款49 了解new handler的行为

1. 当operator new无法满足某一内存分配需求时,它会先调用一个客户指定的错误处理函数(如果客户未指定,它就会抛出异常),所谓的new-handler.为了指定这个"用以处理内存不足"的函数,客户必须调用set_new_handler,那是声明于<new>的一个标准库函数:namespace std{ typedef void (*new_ha...

2015-09-12 21:59:00 82

转载 Effective C++ 条款48 认识template元编程

1. 模板元编程(template mataprogramming,TMP)是编写C++程序并执行于编译期的过程,"所谓template mataprogram(模板元程序),是以C++写成,执行于C++编译器内的程序.一旦TMP程序结束执行,其输出,也就是从templates具现出来的若干C++源码,便会一如往常地被编译".2. 自从templates加入C++,TMP底层特性便被...

2015-09-12 15:43:00 134

转载 Effective C++ 条款47 请使用traits classes表现类型信息

1. STL迭代器分类: input迭代器:只能一次一步向前移动,客户只可读取(不能涂写)且只能读取一次它们所指的东西,模仿指向输入文件的阅读指针.例如istream_iterators output迭代器:与input迭代器类似,但"一切只为输出",只能一次一步向前移动,客户只可涂写(不能读取)且只能涂写一次它们所指向的东西,模仿指向输出文件的涂写指针.例如ostr...

2015-09-12 13:05:00 147

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除