
thinking in c++
wyjvip333
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解模板1
1,模版参数可以有三种类型:(1)类型;(2)编译时常量;(3)其他模版.2,类型:[code="cpp"]#include #include using namespace std;templateclass stack{ T* data; size_t count;public: void push(const T& t);...2010-03-10 11:38:10 · 92 阅读 · 0 评论 -
异常处理之三
1,c++标准提供了一个RAII封装类,用于封装指向对内存的指针,这就使得程序能够自动释放这些内存.2,auto_ptr重载了指针运算符*和->,因此可以像使用原始指针那样使用auto_ptr对象.3,auto_ptr类模版可用作封装指针数据成员,由于通过值引用的类对象auto_ptr总会被析构,因此它封装的原始指针总能被释放.[code="cpp"]#include #inc...原创 2010-02-07 18:54:29 · 108 阅读 · 0 评论 -
异常处理之四
1,标准异常和自定义异常类[code="cpp"]#include #include using namespace std;class MyError:public logic_error{public: MyError(const string& str):logic_error(str){}};void func1(){ t...原创 2010-02-09 21:02:01 · 123 阅读 · 0 评论 -
设计模式之单件模式
1,单件(Singleton):允许一个类有且仅有一个实例.[code="cpp"]#include #include using namespace std;class Singleton{ //私有 Singleton(int x):i(x){} Singleton(const Singleton&); Singleton& ...原创 2010-02-10 19:42:48 · 107 阅读 · 0 评论 -
设计模式之命令模式
1,命令(command)模式最大的特点:允许向一个函数或者对象传递一个想要的动作.[code="cpp"]#include #include using namespace std;class Command{public: //接口,执行的动作 virtual void execute()=0;};class Hello:publ...原创 2010-02-19 19:36:38 · 90 阅读 · 0 评论 -
设计模式之代理模式和状态模式
1,代理(Proxy)模式基本思想:代理类派生自一个基类,由平行地派生自同一个基类的一个或多个类提供实际的实现.2,代理模式和状态模式的区别:代理模式只有一个实现类,而状态模式有多个.3,代码[code="cpp"]#include using namespace std;class ProxyBase{public: virtual void f()...原创 2010-02-20 19:37:39 · 156 阅读 · 0 评论 -
设计模式之模板方法模式
1,模板方法模式的重要特征:它的定义在基类中,并且不能改动."坚持相同的代码"2,实例代码[code="cpp"]#include using namespace std;class MainApp{protected: virtual void m1()=0; virtual void m2()=0;public: //注意这...原创 2010-02-20 21:41:22 · 92 阅读 · 0 评论 -
设计模式之策略模式
1,策略(strategy)模式特征:运行时选择算法,可以用多种方法来解决某个问题.2,实例代码[code="cpp"]#include using namespace std;class Strategy{public: virtual void greet()=0;};class Reject : public Strategy{p...原创 2010-02-20 21:52:48 · 93 阅读 · 0 评论 -
设计模式之职责链模式
1,职责链的本质:尝试多个解决方法,直到找到一个起作用的方法.2,实例代码[code="cpp"]#include #include using namespace std;enum Answer{ NO,YES };class Response{public: virtual Answer canIHave()=0; virtual ~...原创 2010-02-20 22:31:21 · 129 阅读 · 0 评论 -
设计模式之工厂模式
特征:封装对象的创建.1,给一个对象添加新类型时,类的创建必然要发生改变,导致了问题的出现.2,解决办法:强制用一个通用的工厂(factory)来创建对象,而不允许将创建对象的代码遍布于整个程序.3,如果创建对象的代码都装到这个工厂执行,那么在增加新对象时,所要做的全部工作就是只需修改工厂.4,每个面向对象的应用程序都需要创建对象,并且因为人们可能添加新类来扩展应用程序,因此[b]...原创 2010-02-22 23:26:16 · 111 阅读 · 0 评论 -
设计模式之虚构造函数模式
1,虚构造函数模式:"现在还不知道需要什么类型的对象,但是有一些信息,请创建适当的对象."2,实例代码:[code="cpp"]#include #include #include using namespace std;class Shape{ Shape* s; Shape(const Shape&); Shape operat...原创 2010-02-27 19:39:18 · 141 阅读 · 0 评论 -
设计模式之构建器模式
1,目标:将对象的创建和它的表示法分开.2,实例代码:[code="cpp"]#include #include #include using namespace std;class Part{public: //其一个下标的作用 enum BPart{ WHEEL,MOUNTAIN,RACE,PNUM };//这里NUM的使用,计数...2010-03-01 11:08:31 · 121 阅读 · 0 评论 -
通用算法笔记4
1,generate_n(序列起点,个数,函数发生器)2,transform(begin,end,保存起点,unaryfunc)transform(begin1,end1,begin2,保存起点,binaryfunc)实例代码:[code="cpp"]#include #include #include #include #include using nam...2010-03-02 10:15:01 · 93 阅读 · 0 评论 -
通用算法之可调整的函数对象
1,实例代码:[code="cpp"]#include #include #include #include #include using namespace std;//自定义可以调整的函数对象class MyAdd : public binary_function{public: MyAdd(){} //注意const ...原创 2010-03-02 16:51:28 · 118 阅读 · 0 评论 -
STL算法合集
1,简要描述迭代器的各种形式:(1)InputIterator:向单个序列读入元素的输入迭代器,前向传递++和*,可以通过==和!=检测.(2)OutIterator:写入元素的输出迭代器,前向传递++和*,假定连续不断向目的文件发送元素,不能用==和!=检测.注:当(1),(2)作为某个STL算法的模版参数时,该算法可以使用任意"更复杂的迭代器".(3)ForwardIterat...2010-03-04 10:14:50 · 115 阅读 · 0 评论 -
设计模式之观察者模式
1,解决的问题:当某些其他对象改变状态时,如果一组对象需要进行相应的更新,那么应该如何处理.2,实例代码:[code="cpp"]#include #include #include using namespace std;class Observable;class Argument {};class Observer{public: ...原创 2010-03-04 11:54:58 · 108 阅读 · 0 评论 -
防御性编程之三
1,一个常用的宏,用于输出正在执行的语句.[code="cpp"]#define TEACE(ARG) cout原创 2010-02-07 14:50:37 · 114 阅读 · 0 评论 -
防御性编程之二
1,测试程序+编码 快于 直接编码一个简单的测试案例[code="cpp"]#include using namespace std;class MyDate{public: MyDate(int y,int m,int d) { year=y; month=m; date=d; } ...原创 2010-02-07 11:16:46 · 141 阅读 · 0 评论 -
通用容器1
1,一个容器描述了一个持有其他对象的对象.2,c++处理容器采用基于模板的方式.3,针对不同的需要有不同类型的容器:如vector高效访问元素,list高效插入.4,容器持有对象的要求:(1)可拷贝;(2)可赋值.5,容器与容器的区别:(1)内存中存储对象的方式;(2)向用户提供了什么样的操作.6,容器分类总结:(1)序列容器(vector,list,dequeue):将元...2010-03-10 12:19:53 · 132 阅读 · 0 评论 -
深入理解模板2
1,typename关键字:(1)若一个模板代码内部的某个类型被模板参数所限定,则必须使用typename关键字作为前缀声明.注:typename关键字仅仅用于模板代码中.(2)一定不能认为typename创建了一个新类型名.typename Seq::iterator ite;typedef typename Seq::iterator ite;//这才是创建一个新类型名....2010-03-11 10:41:40 · 90 阅读 · 0 评论 -
通用容器2
1,所有基本序列容器(vector,list,deque)所支持的操作.实例代码:[code="cpp"]#include #include #include #include using namespace std;templatevoid print(Container& c, char* title = ""){ cout ...2010-03-11 11:15:07 · 99 阅读 · 0 评论 -
深入理解模板3
1,类模板和函数模板的区别:实例化类模板时总是需要尖括号并且提供所有的非默认参数.对于函数模板经常可以省略掉模板参数,不允许使用默认模板参数.2,若一个函数的模版参数是一个独立的模板参数,则调用它的时候一定要指定它的类型,因为它的类型无法从函数参数中推断出来.实例代码:[code="cpp"]#include #include using namespace std...2010-03-12 09:57:24 · 95 阅读 · 0 评论 -
通用容器3_vector
1,vector特点:(1)将内容放在一段连续的存储区域,索引和迭代操作非常的快.(2)如果当前存储空间不够,需要重新分配一块更大的区域,将原来的对象拷贝到新的存储区,析构原来的对象,释放原来的内存.Allocating a new, bigger piece of storage.Copying all the objects from the old storage to th...2010-03-12 16:52:03 · 124 阅读 · 0 评论 -
通用容器4_deque
1,deque特点:(1)将元素放在多个连续的存储块.(2)允许在序列两端快速地插入元素,并且在扩展存储区的时候不需要拷贝和析构原来的对象.(3)deque支持随机访问[],但是速度没有vector快.2,deque和vector的区别:微不足道.deque有接口push_front()和pop_front(),而vector没有.[code="cpp"]#includ...2010-03-12 17:20:00 · 111 阅读 · 0 评论 -
深入理解模板4
1,函数模板的半有序:生成模板函数的时候,编译器将从这些模板中选择特化程度最高的模板.template f(T):template f(T*);template f(const T*);实例代码:[code="cpp"]#include #include #include #include using namespace std;template...2010-03-15 12:28:01 · 101 阅读 · 0 评论 -
并发学习之一_windows下ZThread在CodeBlocks上的安装与配置
近日在研读Bruce Eckel的《C++编程思想 第二卷实用编程技术》。阅读到"并发"这章,作者使用开源的ZThread作为线程库。总结下自己在CodeBlocks下配置ZTread的过程.1,所需安装程序.(附件提供,包括libthread.a) (1)ZThread-2.3.2 下载地址:[url]http://zthread.sourceforge.net[/url]...原创 2010-01-16 16:21:26 · 295 阅读 · 0 评论 -
并发学习之二_使用线程
LiftOff.h[code="cpp"]#ifndef LIFTOFF_H_INCLUDED#define LIFTOFF_H_INCLUDED#include #include "zthread/Runnalbe.h"//Runnable提供了一个公共接口来执行任意的任务.//档一个类从Runnable派生出来,必须有一个run()函数,但却没有任何天生的线...原创 2010-01-16 16:48:09 · 89 阅读 · 0 评论 -
通用算法笔记1
1,设计STL的目标就是对于几乎每个任务都使用预定义的算法,代替手工编码的工作.例1:[code="cpp"]#include #include #include using namespace std;#if 01,copy的用法.#endifint main(){ int a[] = { 10, 20, 30 }; const siz...原创 2010-01-21 15:30:23 · 91 阅读 · 0 评论 -
通用算法笔记2
1,判定函数(predicate):基于某种标准返回布尔类型值的函数.例1:[code="cpp"]#include #include #include using namespace std;#if 0remove_copy_if()//舍弃判定函数返回true的那些元素.#endif// You supply this predicate...原创 2010-01-21 15:45:21 · 87 阅读 · 0 评论 -
通用算法笔记3
1,流迭代器.ostream_iterator(cout,"\n").//在最后的末端自动写入一个单独的字符串.例1:[code="cpp"]#include #include #include #include using namespace std;bool gt25(int x) { return 25 < x; }int main(){...原创 2010-01-21 17:29:32 · 94 阅读 · 0 评论 -
异常处理之一
1,局部对象清理.[code="cpp"]#include using namespace std;class A{public: A(){ cout原创 2010-02-06 13:51:34 · 99 阅读 · 0 评论 -
异常处理之二
1,关于异常的清理.一个特殊的情况:如果一个对象在执行构造函数的过程中抛出了异常,那么该对象的析构函数将不会被调用.导致之前动态分配的资源无法得到释放.[code="cpp"]#include #include using namespace std;class A{public: A(){ cout...原创 2010-02-06 20:14:51 · 115 阅读 · 0 评论 -
防御性编程之一(断言assert)
1,典型assert()的实现.[code="cpp"]#ifdef NDEBUG #define assert(cond) ((void)0)#else //触发表达式,文件名和行号 void assertImpl(const* char,const* char,long); #define assert(cond) \ ((...2010-02-07 10:51:44 · 216 阅读 · 0 评论 -
关于priority_queue
1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素.调用pop()删除之后,将促使下一个元素进入该位置.2,如同stack和queue,priority_queue是一个基于基本序列容器进行构建的适配器,默认的序列器是vector.先看一个示例:[code="cpp"]#include #include #i...原创 2010-06-18 15:11:44 · 113 阅读 · 0 评论