06 2012 档案
摘要:C++语言虽然兼容C,也支持C语言的类型转换用法,就是将类型用圆括号括起来,这种转换可视性比较差,难以跟踪错误的转换。C++提供了命名的强制转换操作符,毕竟转换有时是不安全的,所以使用命名转换操作符可以根据所使用的转换操作符可以判断风险级别。下面我们就来看看C++提供的四种命名的强制转换操作符的具体功能和用法。1.const_cast2.static_cast3.reinterpret_cast4.dynamic_cast这四个操作符的使用方法是相同的,都是cast-name<Type>(expression),Type是被转换值expression的目标类型。下面看看这四个操作符
阅读全文
摘要:简约神功第三式:隐藏隐藏,最主要的功能就是可以让用户专注于主要功能,不至于被不常用的功能分散注意力。毕竟,隐藏让用户与功能之间有了一层隔膜,所以要仔细斟酌应该隐藏哪些功能,作者提供了如下建议:1.事关细节(如对服务器的配置或设计电子邮件的签名)2.选项和偏好(如修改绘图应用的单位,将px变为cm)3.特定于地区的信息(如日期和时间)那么,具体的隐藏方法和建议有哪些呢?对功能的渐进展示。通常,有些功能会包含少数核心的供主流用户使用的控制部件,另有一些为专家用户准备的扩展性精确的控制部件。隐藏这些精确地控制部件是保持设计简单的不错选择。保存对话框就是个很好的例子,它的核心功能无非是为文件起名,然后
阅读全文
摘要:预处理器为我们定义了四个有用的常量,使用这四个常量可以在错误消息中提供更多的信息,他们分别是:__FILE__ 文件名__LINE__ 当前行号__TIME__ 文件被编译的时间__DATE__ 文件被编译的日期例如,我们可以使用如下小例子看看这几个常量的用法,功能是判断输入的单词是否小于定义的最小长度,如小于则输出错误信息,代码如下:#include <iostream>
#include <string>
using namespace std; int main()
{ const string::size_type THRESHOLD = 3; string w
阅读全文
摘要:在c++中,io操作都是有io对象来实现的,每个io对象又管理一个缓冲区,用于存储程序读写的数据。只有缓冲区被刷新的时候缓冲区中的内容才会写入真实的文件或输出设备上。那么,什么情况下会刷新输出缓冲区呢,有如下五种情况:1.程序正常结束。作为main返回工作的一部分,将清空所有的输出缓冲区。2.在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。3.用操纵符显示地刷新缓冲区,如用endl。4.在每次输出操作执行完毕后,用unitbuf操纵符设置流的内部状态,从而清空缓冲区。5.可将输出流与输入流关联起来,在读输入流时将刷新其关联的输出缓冲区。我们可以通过以下实例
阅读全文
摘要:string是非常强大的类型,很好的封装了字符串的操作,有些时候我们可以把string当做字符的容器,string也支持大多数容器操作,下面就列出string类型所支持的所有操作,本文并不是为了讲解string的用法和应用,而是希望作为string类型的参考文档,每个函数皆在注释后有详细说明,需要用时查阅即可。string操作如下:构造函数: string();//空串 string( size_type length, char ch );//以length为长度的ch的拷贝(即length个ch) string( const char *str );//以str为初值 (长度任意) str
阅读全文
摘要:写程序虽然是广大程序员们的爱好,但是一直写程序也是会疯掉的,从网上找到些幽默的段子与大家共享,缓解一下,哈哈一、程序员方阵同学们,现在向我们走来的是程序员方阵!他们穿着拖鞋,披着毛巾,左手拿着键盘,右手举着鼠标,腋下夹着USB转换器。他们因睡眠不足而显得精神不振,喊着微弱的口号走过主席台。主席问候:程序员们辛苦了!程序员方队异口同声地答道:Hello World!二、真正的程序员真正的程序员从来不写注释,难写的程序必定也难读。真正的程序员不写应用程序,他们直接从最底层的裸机开始编程。 他们认为应用程序编程是那些不会系统编程的人干的活。真正的程序员不画流程图,流程图是没文化的人的文档,居住在山洞
阅读全文
摘要:今天又翻了翻很久前读的一本书,叫做《水煮三国》,当时读的时候就一马平川的过了,也没太多的思考,今天又重温一下,发现本书也是很值得回味的。虽然书名叫三国,但是其实和三国没有太大关系,只是借用了其中的人物谈论管理的事情。虽然不一定人人都做管理者,但是对管理有些了解也是不错的,一方面扩展自己的知识,增长见识。另一方面也对在职场交际和沟通有帮助。总之,学习是没有错误的,庄子说过:吾生也有涯,而知也无涯。虽然我们不能穷见天下所有的知识,但毕竟多知道一点是一点,谁能保证以后不会用到呢。不说废话了,唠正题,本书的第一章写的并不是管理,而是对一个尚未步入社会磨练的年轻人应具有的精神和品质的介绍,本人认为其中的
阅读全文
摘要:map和set容器中,一个键只对应一个实例。而在multimap和multiset中,一个键可以对应多个实例,例如每个人都有一个电话联系人列表,列表中肯定不止一个人。除了不能对multimap中元素调用下表操作符之外,multimap和multiset提供的操作与map和set相同。但是因multimap和multiset是一个键对应多个元素,所有对应操作有一些改变,对于multimap和multiset中的某个键,要处理多个值得准备。在multimap和multiset中insert一个元素时总会插入元素,因为一个键可对应多个值。使用带有一个键参数的erase函数时,删除该键所对应的所有元素
阅读全文
摘要:map中存放的是键值对,而set中存放的只是键的集合,所以set中没有mapped_type类型,value_type也是不pair类型,而是与容器中存放元素的类型相同。set的操作与大部分map操作相同,但是不支持下标操作。set提供的操作如下:begin()返回指向第一个元素的迭代器clear()清除所有元素count()返回某个值元素的个数empty()如果集合为空,返回trueend()返回指向最后一个元素的迭代器equal_range()返回集合中与给定值相等的上下限的两个迭代器erase()删除集合中的元素find()返回一个指向被查找到元素的迭代器get_allocator()返
阅读全文
摘要:归并排序是一种高效的排序算法,时间复杂度为nlogn,与快排相当,是分治法的一种典型应用。归并排序的思想是将若干个有序的序列合并为一个有序序列,常用的是二路归并,也就是将两个有序子序列合并为一个序列。归并排序可用递归完成,第一次排序将序列分成两部分,第二次排序将两序列在分成两部分,如此下去,直到每个子序列只有一个元素,则子序列自然有序,然后合并即可。归并操作的工作原理如下: 1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2.设定两个指针,最初位置分别为两个已经排序序列的起始位置 3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下...
阅读全文
摘要:本程序的功能是对文本中需要转换的单词进行转换。程序需要两个文件,一个文件存放转换单词对照表,另一个文件存放要进行转换的文本。本程序的文本文件内容如下:trans_word_map.txt'em themcuz becausegratz gratefuli Inah nopos supposedsez saidtanx thankswuz wasto_be_trans.txtnah i sez tanx cuz i wuz pos to not cuz i wuz gratz程序设计和思路在程序注释中有说明,不再赘述代码如下:/** 单词转换程序* 命令后带两个参数* 第一个参数表示对照
阅读全文
摘要:map可以理解为之中关联数组,之所以称为关联是因为map是通过键值来访问,而不是通过元素在数组中的位置来访问。map的键类型必须满足严格弱排序,解释一下:1.当键值与自身比较时,一定产生false结果2.两个键不能相互小于,而且如果 k1<k2, k2<k3 那么 k1<k33.如果两个键值相互不小于,则视为相等map定义的类型:map<k, v>::key_type;键的类型map<k, v>::mapped_type;键所关联值的类型map<k, v>::value_type;一个pair类型,pair类型就是包含两个类型的一种模板类型
阅读全文
摘要:STL的顺序容器还有最后两种,这两种都是适配器,分别是queue和priority_queue,这两种容器用法基本相同,所以就放在一块说了。他俩的构造函数形式与stack完全一样,而且都包含在queue头文件中。他们提供的操作如下:queue:back() 返回最后一个元素 empty() 如果队列空则返回真 front() 返回第一个元素 pop() 删除第一个元素 push() 在末尾加入一个元素 size() 返回队列中元素的个数priority_queue:empty() 如果优先队列为空,则返回真 pop() 删除第一个元素 push() 加入一个元素 size() 返回优先队列中拥
阅读全文
摘要:deque是double-ended queue的简称,是一种类似vector的容器,提供随机访问功能,与vector不同的是,deque可以实现在头部和尾部两端插入元素。deque提供的操作和vector很相似,列出如下:Constructors 创建一个新双向队列构造函数有如下原型: deque();//无参 deque( size_type size );//构造n个元素的deque deque( size_type num, const TYPE &val );//构造n个元素初始化为val的deque deque( const deque &from );//初始化为
阅读全文
摘要:先说明一个概念,适配器(adapter),适配器是标准库中的通用概念,包括容器适配器、迭代器适配器、函数适配器。本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型以一种不同的抽象类型的工作方式实现。STL提供了三种顺序容器适配器,queue、priority_queue、stack。每一种适配器都定义了两个构造函数,如下:A a;//创建空适配器aA a(c);//用一个容器c初始化适配器a默认的stack和queue都基于deque实现,priority_queue基于vector实现。创建适配器时通过将一个顺序容器指定为适配器的第二个类型实参,可
阅读全文
摘要:下面来看简约神功第二式,组织。这种策略比较常用,成本也低,仅仅是改变界面的布局或者标签的位置即可达到。组织的方式和原则主要有一下几种:一:分块。这是一种非常常见的组织方式,大部分软件应该都有菜单栏吧,菜单栏就是对所有的功能分成了几大块,就拿word来说吧,将功能分为了9个大的菜单,每个菜单中又有许多菜单项,如果菜单项还有许多功能,就在将菜单项分解成几个菜单项,比如说视图->工具栏下还有许多工具选项。一般来说,分块要遵循7加减1的规则,因为人的大脑可以瞬间记住的最大数目也就7,8个。虽然这不是死规定,但分块应该尽量比这少,而不是比十块以上,总之,越少的块数用户接受起来就越轻松。二:围绕着行
阅读全文
摘要:闲着没事,做个小小的测试,测试一下冒泡,选择,插入和快速四种排序对同一个含有1000000个元素的数组排序所用的时间,做个比较。四种排序的代码如下:冒泡排序:template <typename T>
void bubble_sort(T a[], int num){ if(num ==0 || num == 1) return ; bool changed = false; do{ for(int i=0; i<num-1; i++){ if(a[i] < a[i+1]){ swap(a[i], a[i+1]); changed = true; }
...
阅读全文
摘要:快速排序是一种效率很高的排序,具有最好nlogn,最坏n2的复杂度,总的来说,快排的效果是非常好的,如果有兴趣研究算法性能的分析,推荐阅读《算法导论》,我在这里就不分析了,也分析不明白。总之,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。举个例子:a[5] = {4, 2, 5, 3, 1}假如选第一个元素为分割元素,第一趟排序之后的序列为:2 3 1 4 5左边的序列为(左一)2 3 1右边的序列为(右一)5递归排序左右两序
阅读全文
摘要:list将元素按顺序储存在链表中. 与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢. list提供如下三种构造函数:list<T> l1;list<T> l2(l1);list<T> l3(b, e);b,e是指定范围的两个迭代器list提供如下的接口函数,具体实现及函数原型请参阅其他帮助文档assign() 给list赋值 back() 返回最后一个元素 begin() 返回指向第一个元素的迭代器 clear() 删除所有元素 empty() 如果list是空的则返回true end() 返回末尾的迭代器 erase() 删除一
阅读全文
摘要:Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。vector定义了五种构造函数分别是:vector<T> v1;vector<T> v2(v1);vector<T>v3(b, e)vector<T> v4(n, i);vector<T> v5(n);vector包含如下接口函数,如需详细了解,请参阅相关帮助文档Constructors 构造函数 Operators 对ve
阅读全文
摘要:选择排序是一种不稳定的排序方法,排序思想比较简单,大致可描述为:每次在待排序元素中选出最小元素,放到前面,如此下去,每次选出的都是剩余元素的最小元素,直至待排序元素只剩一个时,排序结束,演示过程如下:设待排序有n个元素,分别为[1...n],未排序时,有序区元素个数为零,无序区元素个数为n。以五个元素为例,a[5] = {5, 4, 3, 2, 1}第一趟排序从无序区选出最小元素为1,与无序区第一个元素5交换,得到序列1 4 3 2 5这时1为有序区,4 3 2 5为无序区第二趟排序在新的无序区中选出最小元素为2,与无序区的第一个元素4交换,得到序列1 2 3 4 5这时1 2为有序区,3 4
阅读全文
摘要:书接上文,谈谈简约设计的第一个方面:删除。为什么要删除呢,因为很多功能是没有用的,说到这,可能会有人反驳,没有用为什么还要加到软件里呢,那不是没事找事吗。我说的功能没用分两个方面,一方面是真的没用,一方面是对于普通用户来说没有用。对于第一种,真的没有用的功能,是必须要删除的,因为这种功能对用户来说就是一种迫害,本来没有用,还要人家学,这不有病吗。那么,这种功能是怎么来的呢,多数是因为设计者的一厢情愿,他们总是想让自己的软件能有很多的功能,能做很多的事情,还总是打着用户的名义,假如用户需要这个功能呢,假如用户需要那个功能呢,其实大多数用户,对软件的要求很简单,能做我想要让他做的事情就可以了,用户
阅读全文
摘要:最近读了一本关于交互设计的书,叫做《简约至上:交互式设计四策略》,作者是一位英国人。本书内容非常精炼,而且有一半的页数是插图,所以一直看的话三四个小时足够了,虽说书的篇幅不大,但内容却是句句箴言,值得细细回味。总的来说,本书描述了简约设计的四种主要策略。首先说说什么是简约,记得利郎的广告词说:简约而不简单。先解释一下简约和简单吧,简单是一个常用到否定句的词语,本义是不复杂,单纯,不存细。而简约是简洁、大方、精致,是形容一种层次的升华。而用到软件设计上也是如此,简约就是要让软件易用而又优雅,把软件当做一件艺术品来做。为什么简约如此重要呢?就当下来看,社会越来越进步,人们的品位越来越高,生活的节奏
阅读全文
摘要:冒泡排序是一种简单实用的排序算法。是稳定的。其基本思想为:从第一个元素开始,与相邻的后一个比较,如果前一个元素大于后一个元素,则元素交换,否则不动;然后比较第二个和第三个,前大后小则交换,否则不换;如此下去,比较完第n-1个和第n个元素之后,第一趟排序结束,此时最大的元素被换到了最后面。第二趟继续以上动作,只比较前n-1个元素即可,因为最大的已经到了最后面,无需再比较,第二趟结束后,这时倒数第二大的元素被换到了倒数第二个位置。继续如此比较,n-1趟之后第二小的元素被放到了第二位,这时排序结束。算法演示如下:给定序列 5 4 3 2 1第一趟排序演示: 第一次比较:4 5 3 2 1 第二次比较
阅读全文
摘要:二叉排序树又称二叉查找树,是一种的高效的查找数据结构,查找效率等同二分法。 以下是二叉查找树的一种简单模板实现:#include <iostream>using namespace std;template <typename T>class BinSearchTree{public: typedef Node* tree; BinSearchTree():rp(NULL), n(){} ~BinSearchTree(){ _clear(); n = 0; } void insert(const T& d){ _insert(rp, new Node(d));
阅读全文
摘要:简单的单链表模板实现:#include<iostream>using namespace std;template <typename T>class List{public: //构造函数 List():head(NULL), len(0){} //析构函数 ~List(){ clear(); } //判断链表是否为空 bool empty()const{ return head == NULL; } //返回链表元素的个数 int size()const{ return len; } //遍历链表 void travel()const{ if(empty()) re
阅读全文
摘要:《Effective C++》,久闻大名,幸得一见,都说c++程序员分两类,看过EffectiveC++的和没看过的,可见对此书评价之高,很少人能出其右。身为菜鸟,先看一遍,记记笔记,留着以后水平提高后回来批斗自己。都说C++是难学易用的语言,难学是因为她具有多种编程范式,既能进行过程化编程(procedural),也能进行面向对象编程(object-oriented),也支持泛型编程(generic),甚至还有元编程(metaprogramming)。正是因为有如此强大的能力,才导致了C++的难学。当然,世上木有免费的午餐,要想人前显贵,就得背后受罪啊,要想学好c++,一定要下功夫。废话少说
阅读全文

浙公网安备 33010602011771号