自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Smile&搁浅

知识的积累,只需每天进步一点点!

  • 博客(55)
  • 资源 (12)
  • 收藏
  • 关注

原创 全局变量和局部变量在内存中的区别

答:有区别。全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。该题目考查的知识点是变量的存储类型及性质。C语言经过编译之后将内存分为以下几个区域:(1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结

2016-06-29 22:27:14 26810

转载 C++编写线程池

#include #include #include using namespace std;#define WM_THREADSTART WM_USER+1#define WM_THREADEND WM_USER+2#define WM_THREADADD WM_USER+3#define WM_THREADPOOLEND WM_USER+4#define WM_THREA

2016-06-29 22:12:58 343

原创 一棵树是否为另一棵树的子结构

题目描述输入两颗二叉树A,B,判断B是不是A的子结构。问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,         拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第

2016-06-29 21:45:53 1955

原创 合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。非递归版本/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:

2016-06-29 20:59:11 335

原创 无线安全配置(wifi 认证,加密)

http://www.360doc.com/content/12/0601/20/9424702_215282780.shtml#

2016-06-27 22:13:14 1269

原创 反转链表

题目描述输入一个链表,反转链表后,输出链表的所有元素。链表的反转问题(递归和非递归方式)定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点。typedef struct Node{ int data; Node *next;} Node, *List;链表类的问题,涉及到了很多指针的

2016-06-27 15:55:09 310

原创 输出该链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(

2016-06-27 11:13:13 930

原创 数值的整数次方Power

题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大树问题。这道题目有以下几点需要注意:0的0次方是无意义的,非法输入0的负数次方相当于0作为除数,也是无意义的,非法输入base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒

2016-06-26 09:25:48 543

原创 C++的初始化问题

首先,我们应该明确的是在C++中初始化不是赋值,因为初始化是必要的,如果读取了未初始化的值将会导致不明确的行为。初始化指创建变量并且给它赋初值,而赋值则是擦除对象的当前值并用新值代替。C++支持两种初始化变量的方式:复制初始化和直接初始化。int ival(1000);//直接初始化是将初始化式放在括号里int ival=1000;//复制初始化是用等号(=)那么这

2016-06-25 20:00:45 429

原创 一棵树是否为另一棵树的子树

问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断,         拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第二个树的的根节点开始。测试用例:树1

2016-06-25 17:27:46 913

原创 字符串和数字之间的转换(C/C++)

1、字符串数字之间的转换(1)string --> char *   string str("OK");   char * p = str.c_str();(2)char * -->string   char *p = "OK";   string str(p);(3)char * -->CString    char *p ="OK";   CSt

2016-06-24 11:04:45 1274

原创 快速排序

实现快速排序的关键在于现在数组中选择一个数字,接下来将数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。代码实现如下:#include #include using namespace std;int RandomInRange(int start, int end){ srand(time(NULL)); return sta

2016-06-23 17:50:06 383

原创 最大连续子向量(分治策略和扫描算法)

问题及简单算法本章引入的问题来自一维的模式识别,问题的输入是具有n个浮点数的向量x,输出是输入向量的任何连续子向量中的最大和。 例如,如果输入向量包含以下 N = 10 个元素: arr[N] = { 31, -41, 59, 26, -53, 58, 97, -93, -23, 84 } 那么该程序的输出为x[2…6]的总和,即187。 该问题分为以下几种情况:

2016-06-21 12:17:41 841

原创 STL源码剖析——仿函数(函数对象)

1 仿函数也称为函数对象,是一种具有函数特质的对象。调用者可以像函数一样的使用这些对象,例如在很多STL算法中,都可以看到,我们可以将一个方法作为模板内的参数传入到算法实现中,例如sort的时候我们可以根据我们传入的自定义的compare函数来进行比较排序。解决办法是使用函数指针,或者是将这个“操作”设计为一个所谓的仿函数,再用这个仿函数生成一个对象,并用这个对象作为算法的一个参数。

2016-06-20 16:20:32 820

原创 STL源码剖析——set相关算法

STL中定义的set要求元素不得重复且已经排序。而set算法要求的都是有序区间(输出也是有序的),但元素可以重复出现。STL提供了4个set相关的算法,分别是并集(union)、交集(intersection)、差集(difference)和对称差集(symmetric difference),这4个算法接受的set必须是有序区间,都至少接受4个参数,分别表示两个set区间。一般而言,se

2016-06-20 11:54:24 1520

原创 STL源码剖析——stl_algobase.h

STL标准中没有区分基本算法或复杂算法,单SGI把常用的一些算法定义在只中,其他算法定义在中。stl_algobase.h中的算法,比较值得学习的是copy(),它“无所不用其极”的改善效率。copy的目的是复制一段元素到指定区间,复制操作最容易想到赋值操作符=,但是有的赋值操作符=是trivial的,可以直接拷贝。关于赋值操作符=是不是trivial的,可以参考“Member

2016-06-20 10:52:55 3366

原创 STL源码剖析——stl_numeric.h

在STL中,算法是独立于特定的数据结构,称为泛型算法。本节介绍的数值算法是在源码SGI STL中的文件,具体功能详见下面的源码剖析,在源码剖析的时候,针对每个元素都给出了使用例子,这样可以增加对其理解。#ifndef __SGI_STL_INTERNAL_NUMERIC_H#define __SGI_STL_INTERNAL_NUMERIC_H__STL_BEGIN_NAMESPAC

2016-06-18 15:28:40 1692

原创 STL源码剖析——hash_map和hash_multimap

SGI STL中的map底层以红黑树实现,hash_map以hash table实现。hash_map不允许插入重新键值,hash_multimap允许插入重复键值。这两者的关系就像map和multimap的关系。底层的hash table提供的大部分的操作,hash_map(hash_multimap)大部分都是直接调用hash table的函数。hash_multimap和ha

2016-06-18 09:26:20 1666

原创 STL源码剖析——hash_set和hash_multiset

STL只规定接口和复杂度,对于具体实现不作要求。set大多以红黑树实现,但STL在标准规格之外提供了一个所谓的hash_set,以hash table实现。hash_set的接口,hash_table都提供了,所以几乎所有的hash_set操作都是直接调用hash_table的函数而已。除了hash_set,还有hash_multiset,它们两个的关系就像set和multiset

2016-06-18 09:21:32 514

原创 STL源码剖析——hashtable

二叉搜索树具有对数时间的搜索复杂度,但是这样的复杂度是再输入数据有足够的随机性的假设上哈希表在插入删除搜索操作上也具有常数时间的表现,而且这种表现是以统计为基础,不需要依赖输入元素的随机性hashtable提供对任何有名项的存取操作和删除操作,可以视为一种字典结构,负载系数:元素个数除以表格大小,除非使用开链,负载系数永远在0,1之间碰撞的解决方

2016-06-17 13:38:39 2147

原创 STL源码剖析——multimap

multimap和map的关系和multiset和set关系一样,multimap允许有重复的键值,它在使用底层数据结构红黑树用,插入操作用的是insert_equal,而不是insert_unique。G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_multimap.h 完整列表/* * * Copyright (c) 1994 * Hew

2016-06-17 10:06:20 663

原创 STL源码剖析——multiset

STL中的set不允许键值重复,因此就有了multiset。multiset和set操作一样,功能一样,但是multiset允许键值重复,在使用红黑树的插入操作是,用的是insert_equal,而set用的是insert_unique,其他代码一样。G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_multiset.h 完整列表/* * * C

2016-06-17 10:05:20 346

原创 STL源码剖析——map

map是STL中的标准关系容器,它存储的元素时pair,拥有键值key和实值value。按照键值key存储到红黑树中。map中不允许两个键值相同的元素。当元素插入到红黑树中后,键值key不可以再修改,但是其实值value可以修改,因为map的迭代器不是constant iterator,而是mutable iterator。G++ 2.91.57,cygnus\cygwin-b20\inc

2016-06-17 09:24:05 456

原创 STL源码剖析——set

SET是STL中的标准容器,SET里面的元素会根据键值自动排序,它不像map那样拥有实值value和键值key的对应,set只有实值。SET的底层实现时RB-tree,当插入到RB-tree中后,其值不能再更改,因为更改就意味着可能不符合RB-tree的特性了,所以其迭代器set::iterator是RB-tree的constrant iterator。由于SET底层是RB-tree,所以SE

2016-06-17 09:10:16 1487

原创 STL源码剖析——stl_tree.h

STL中,关联式容器的内部结构是一颗平衡二叉树,以便获得良好的搜索效率。红黑树是平衡二叉树的一种,它不像AVL树那样要求绝对平衡,降低了对旋转的要求,但是其性能并没有下降很多,它的搜索、插入、删除都能以O(nlogn)时间完成。平衡可以在一次或者两次旋转解决,是“性价比”很高的平衡二叉树。RB-tree(red black tree)红黑树是平衡二叉树。它满足一下规则(1)每个节点不是红色

2016-06-17 08:56:58 1899

转载 STL源码剖析——红黑树(RB-tree)

本套源码剖析把重点放在红黑树的3种插入情况,与红黑树的4种删除情况。其余的能从略则尽量简略。目录:一、左旋代码分析二、右旋三、红黑树查找结点四、红黑树的插入五、红黑树的3种插入情况六、红黑树的删除七、红黑树的4种删除情况八、测试用例好的,咱们还是先从树的左旋、右旋代码,开始(大部分分析,直接给注释)://一、左旋代码分析/*------

2016-06-16 22:51:12 616

转载 STL源码剖析——RB-tree

一、红黑树概述     红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。这一点在我们了解了红黑树的实现原理后,就会有更加深切的体会。     红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL

2016-06-16 22:43:32 1663

转载 教你初步了解红黑树

教你初步了解红黑树 作者:July、saturnman   2010年12月29日本文参考:Google、算法导论、STL源码剖析、计算机程序设计艺术。推荐阅读:Left-Leaning Red-Black Trees, Dagstuhl Workshop on Data Structures, Wadern, Germany, Fe

2016-06-16 21:57:49 220

原创 哈夫曼树

一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树:        在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: if(score<60) cout<<"Bad"<<endl;

2016-06-15 18:37:11 2444

转载 同一进程的线程共享的资源和独有的资源

线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。     进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:    1.线程ID      每个线程都有自己的线程ID,这个ID在本进程中是唯一的

2016-06-15 16:19:45 713

原创 TCP/IP详解——数据链路层

1.概述     数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型。      在TCP/IP协议族中,数据链路层主要有三个目的:          1)为IP模块发送和接收数据          2)为ARP模块发送ARP请求和接收ARP应答          3)为RARP模块发送RARP请求和接收RARP应答     TCP/IP支持多

2016-06-15 15:56:53 10223 1

原创 TCP/IP详解——概述

为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就

2016-06-15 15:51:21 404

原创 STL源码剖析——priority_queue

一、概述priority_queue,首先它是一个queue,即只允许在低端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径(故priority_queue不提供遍历功能,也不提供迭代器);再次它具有priority,即queue中的元素具有一定的priority:其内的元素自动依照元素的权值排列,权值最高者(也就是数值最高),排在最前面。注:在queue并非

2016-06-15 11:23:31 571

原创 STL源码剖析——heap

Heap堆是常用的数据结构,Heap中也可以存放元素。但是STL中并没有提供Heap容器,只是提供了关于Heap操作的算法。只要支持RandomAccessIterator的容器都可以作为Heap容器。Heap分为max heap和min heap,max heap中每次取出的结点时heap结构中值最大的结点,min heap中每次取出的结点时heap结构中值最小的结点。在实际应用中,经常

2016-06-15 11:03:23 2457

原创 STL源码剖析——queue

stack 是一种配接器(adapter),以某种容器作为底部结构,改变其接口,使之符合"先进先出"的特性。SGI STL 默认以 deque 为 stack 底部结构,没有遍历行为,没有遍历器。queue是一种先进先出(First In First Out, FIFO)的数据结构,它在前后有两个出口,分别成为队头和队尾.queue允许在队尾追加元素和访问队尾元素, 在队头获取和移除元素,

2016-06-15 10:48:41 722

原创 STL源码剖析——stack

stack容器配接器stack是一种“先进后出”的数据结构,它只能在栈顶对数据进行操作,即只能在栈顶进行新增元素、移除元素、取得最顶端元素。不能进行遍历行为,所以不需要设计自己的迭代器。在SGI STL的源码的设计中,它是基于某种容器作为底部结构的,默认容器是deque容器,用户也可以自己指定容器的类型。    由于源码比较短,同时是基于其他容器进行操作的,这里只给出源码的剖析

2016-06-15 10:29:22 791

原创 STL源码剖析——slist

slist是SGI STL里面的一个单向链表,不过这个不属于标准定义,所以,G++下面不能用,另外看了下VS2008里面也没有。不过看到书上这一部分讲解,还是配合SGI的代码做一个了解。一般情况下使用标准的list就可以满足要求了,而且会更加方便,list的分析可以参考STL笔记之list一文。因为slist是单向链表,所以它的迭代器类型为forward_iterator。1. slist

2016-06-15 10:16:20 582

原创 STL源码剖析——deque

一、deque的中控器deque是连续空间(至少逻辑上看来如此),连续线性空间总令我们联想到array或vector。array无法成长,vector虽可成长,却只能向尾端成长,而且其所谓的成长原是个假象,事实上是(1)另觅更大空间;(2)将原数据复制过去;(3)释放原空间三部曲。如果不是vector每次配置新空间时都有留下一些余裕,其成长假象所带来的代价将是相当高昂。      de

2016-06-14 21:50:27 2108

原创 STL源码剖析——list

相较于vector的连续线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。      list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vecto

2016-06-07 20:04:26 1820

转载 STL源码剖析——vector

// Filename: stl_vector.h// Comment By: 凝霜// E-mail: [email protected]// Blog: http://blog.csdn.net/mdl13412/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permissi

2016-06-07 19:56:10 342

惠普打印机驱动(LaserJet_1010_1012_1015)

惠普打印机驱动,支持型号为:LaserJet_1010_1012_1015

2016-11-03

STL源码讲解文档

身为C++标准库最重要的组成部分,STL(标准范本库)不仅是一个可复用元件库,而且是一个包罗演算法与资料结构的软体框架(framework)。“框架”这个词,本身就有庞大、稳定、完整而可扩展的涵义。软体框架,则是用一行行精细准确的源码,构造一个庞大、稳定、完整而可扩展的软体架构,稍有软体发展经验的人都知道,要做到这些,谈何容易! STL在1994年走入C++标准,使得原本即将推出的C++标准延迟4年问世而无怨无悔,并为之对内容做巨幅改进,而今STL不仅为千千万万C++程式师所日常运用,而且获得极高的学术赞誉,成为了一个典范,一种境界。作为一个软体框架,STL所取得的成功,实在可以用“辉煌”来形容,其所内涵的软体思想和技术经验,更是无比的深厚与精致。 学习编程的人都知道,阅读剖析名家代码乃是提高水准的捷径。源码之前,了无秘密,大师们的缜密思维,经验结晶,技术思路,独到风格,都原原本本地体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品味都会获得快速的成长。特别是面对STL这样优秀而普遍的作品,无论你是为了满足作为程式师第二天性的求知欲,还是在日常工作中解决实际问题,总会有一天,你会打开一个叫做<vector>或者<algorithm>的表头档,想把STL背後的秘密看个究竟。英文 有一个常用短语,叫做“under the hood”,钻进魔术师的帐篷,屏住呼吸,瞪大眼睛,把那些奇妙的魔法看个通透,让自己的理解和技艺获得巨幅的提升,这种诱惑,任何一个程式师都无法抵挡! 不过,想要研读STL源码,绝对没有那麽简单。STL是精致的软体框架,是为优化效率而无所不用其极的艺术品,是资料结构与演算法大师经年累月的智慧结晶,是泛型思想的光辉诗篇,是C++高级技术的精彩亮相,这些灿烂的赞誉,体现在数万行源码 ,对於一个初涉此道的学习者来说,就是一个感觉:“难!”。无论你是会浅尝辄止地退出这次探险,还是勇敢地向浓雾中前进,当你受困於STL精致的大网之中,为那些迷一般的结构和动作感到茫然无措的时候,所有人都会冒出一个念头:“如果有这样一本书,既能够提纲挈领,为我理顺思绪,指引方向,同时又能够照顾小节,阐述细微,帮助我更快更好地理解STL源码,那该有多好!”

2016-06-05

STL源码剖析 候捷配套

身为C++标准库最重要的组成部分,STL(标准范本库)不仅是一个可复用元件库,而且是一个包罗演算法与资料结构的软体框架(framework)。“框架”这个词,本身就有庞大、稳定、完整而可扩展的涵义。软体框架,则是用一行行精细准确的源码,构造一个庞大、稳定、完整而可扩展的软体架构,稍有软体发展经验的人都知道,要做到这些,谈何容易! STL在1994年走入C++标准,使得原本即将推出的C++标准延迟4年问世而无怨无悔,并为之对内容做巨幅改进,而今STL不仅为千千万万C++程式师所日常运用,而且获得极高的学术赞誉,成为了一个典范,一种境界。作为一个软体框架,STL所取得的成功,实在可以用“辉煌”来形容,其所内涵的软体思想和技术经验,更是无比的深厚与精致。 学习编程的人都知道,阅读剖析名家代码乃是提高水准的捷径。源码之前,了无秘密,大师们的缜密思维,经验结晶,技术思路,独到风格,都原原本本地体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品味都会获得快速的成长。特别是面对STL这样优秀而普遍的作品,无论你是为了满足作为程式师第二天性的求知欲,还是在日常工作中解决实际问题,总会有一天,你会打开一个叫做<vector>或者<algorithm>的表头档,想把STL背後的秘密看个究竟。英文 有一个常用短语,叫做“under the hood”,钻进魔术师的帐篷,屏住呼吸,瞪大眼睛,把那些奇妙的魔法看个通透,让自己的理解和技艺获得巨幅的提升,这种诱惑,任何一个程式师都无法抵挡! 不过,想要研读STL源码,绝对没有那麽简单。STL是精致的软体框架,是为优化效率而无所不用其极的艺术品,是资料结构与演算法大师经年累月的智慧结晶,是泛型思想的光辉诗篇,是C++高级技术的精彩亮相,这些灿烂的赞誉,体现在数万行源码 ,对於一个初涉此道的学习者来说,就是一个感觉:“难!”。无论你是会浅尝辄止地退出这次探险,还是勇敢地向浓雾中前进,当你受困於STL精致的大网之中,为那些迷一般的结构和动作感到茫然无措的时候,所有人都会冒出一个念头:“如果有这样一本书,既能够提纲挈领,为我理顺思绪,指引方向,同时又能够照顾小节,阐述细微,帮助我更快更好地理解STL源码,那该有多好!” 望着长长的STL着作列表,一个“真正”的C++程式师,多少会有一点遗憾。自从STL问世以来,出版了大量的书籍,帮助读者了解它的思想,学习它的用法,掌握它的技巧。其中佼佼者如Matt Austern的《Generic Programming and STL》,Nicolai Josuttis的《The C++ Standard Library》,Scott Meyers的《Effective STL》,已成C++经典名着。然而,定位在引导学习者进行STL源码分析的着作,可以说是凤毛麟角。毕竟,既要能高屋建瓴,剖析大架构,不为纷繁琐碎之细节而迷乱,又能具体而微,体现细致之处的精妙缜密,不因为宏大体系而失之粗略,无论对於专家高手还是技术作者,都是太难达到的目标。 读了这本《STL源码剖析》之後,我认为,这个遗憾终於被补足了! 本书的作者侯捷先生是蜚声海峡两岸的着名IT技术作家,在C++,Windows系统原理,泛型理论和STL等技术领域有极深的造诣。然而,侯捷最令人称道之处,乃是他剖析大架构的能力。所谓剖析大架构,就是要在洋洋洒洒数以万行计的源码中,精准定位,抽取核心观念,高屋建瓴,纲举目张,将看上去乱麻一般的源码梳理得头绪清晰,条理分明,同时又照顾细节,叁透精微,把一个个关键动作阐述得通通透透,这种能力,我以为至少在华人技术作者中,侯捷堪执牛耳。在他的名作《深入浅出MFC》中,侯捷将自己这方面的能力展现得淋漓尽致,而在这本《STL源码剖析》中,我们又看到了一次更加精彩的表现。 我有机会作为大陆最早的几个读者之一,详细拜读了侯捷的这本最新STL专着,感到了一种强烈的技术冲动,说得俗一点,就是觉得很过瘾!具体来说,我以为这本书至少有四大特点,使它成为我所见过的最出色的一本STL源码剖析类着作。 首先,选材精当,立足高远。STL是一个标准,因而有各种实作版本。本书所剖析的SGI STL,可以说是设计最巧妙,思想最深刻,获得赞誉最盛,认同最广的STL实作。当然,这份出自STL之父Alex Stepanov,以及Matt Austern,David Musser等巨匠之手的经典作品,剖析阐述起来自然也需要花费更大的心力。侯捷籍其扎实的理论与技术素养,毅然选择这份作品来剖析,是需要极大勇气与自信的。同样,本书对读者的预期,也是很高的,不但要有扎实的基本功,更要有掌握STL的兴趣与坚韧意志。读这本书,你可以有充分的信心,学到的是超一流大师的思想和经验,所谓名门正派,高屋建瓴。 其次,脉络清晰,组织顺序匠心独具。任何人打算系统阅读STL源码,所必须作出的第一个决定就是,从何处开始?我在初读此书时,一个最疑惑的地方就是侯捷居然把allocator放在所有组件之前讲述。要知道,allocator这个东西,对一般的使用者完全透明,根本感觉不到其存在,以至於在名着《The C++ Standard Libaray》中,Nicolai Josuttis将这一部分放在全书最後。既然如此,又何必让这个无名小卒占据头版头条?我一开始还真是不理解。直到後来,我自己有一些扩展STL的实践,才发现,用的时候你固然可以对allocator不闻不问,但一旦要领悟STL的工作原理,或者要自己扩展STL的功能,则对於allocator的掌握几乎是第一先决条件。不了解allocator,则无论剖析也好,扩展也罢,必然处处碰壁。侯捷毫不迟疑首先帮读者搬开这块绊脚石,理出头绪,实在是匠心独具。紧接着的第三章iterator及traits,直入STL的核心观念与关键技术,剑走中锋,直取要害,高举高打,开诚布公,直接把理解STL的钥匙交道读者手上。此章一过,读者神气完足,就可以大刀阔斧地打通STL的重重关隘。此布局只要稍有变化,读者的学习难度势必猛增。侯捷的此种安排,实在是大家手笔! 此外,本书在技术上迎难而上,详略得当,完整而重点突出。了解SGI STL的读者都知道,这份作品对C++标准中的STL做了大量的扩充,增加了专用的高效allocator,用以操作巨型字串的rope,单链表slist,以及万众企盼的hash容器等等,再加上STL本身就有很多精微之处,技术上的难点不少。此类书籍的作者,但凡稍有一丝懈怠之心,大可以冠冕堂皇地避重就轻。然而侯捷在此书中对重点难点毫不避讳,无论是标准功能还是非标准功能,只要对读者理解STL架构有益,只要有助於提高读者的技术,增长读者的视野与经验,书中必然不畏繁难,将所有技术细节原原本本和盘托出。另一方面,所谓剖析源码,其目的在於明理,解惑,提高自身水平,并不是要穷经皓首,倒背如流。因此,一旦道理讲清楚,书中就将重复与一般性的内容一笔带过,孰轻孰重,一目了然,详略十分得当,这一点对於提高读者的学习效率,有着巨大的意义。 最後一点,本书通过大量生动范例和插图讲解基本思想,在同类书籍中堪称典范。虽然我把这一点放在最後,但我相信大部分读者站在书店,随手翻过这本书,得到的第一印象便是这一点。STL之所以为大家所津津乐道,除了其思想深刻之外,最大的因素是它实用。它所包装的,是演算法与资料结构的基本功能。作为一个程式师,如果你是做资料库编程的,大可以不懂组合语言,如果你是写驱动程式的,大可以不必通晓人工智慧,写编译器的可以不用懂什麽电脑图形学,作业系统内核高手的不用精通网站架设,然而,如果你不懂资料结构与演算法的基础知识,不具备资料结构与演算法的基本技能,那就完全丧失称为一个程式师的资格!市面上讲述演算法与资料结构的专着汗牛充栋,俯拾皆是。相比之下,本书倒并不是以此为核心目标的。但是,可曾有哪位读者看到任何一本书像本书一样,将红黑树用一张张清晰生动的图解释得如此浅显易懂?所谓一图胜千言,在教授基本资料结构与演算法方面,我想不出还有任何一种方法,能够比幻灯般的图片更生动更令人印象深刻了。读过此书的每一位读者,我想都会为书中那一副副插图所打动,作者细致严谨的作风,时刻为读者考虑的敬业精神,也许是更值得我们尊敬的东西。 侯捷先生在一篇影响广泛的STL技术杂文中,将STL的学习境界划分为三个阶段,(1) 会用,(2) 明理,(3) 扩展。阅读STL源码是由第一层次直贯第二层次,而渐达於第三层次的一条捷径,当然也是条荆棘之路。如果你是一个勇於征服险峰的程式师,如果你是一个希望了解under the hood之奥秘的程式师,那麽当你在攀登STL这座瑰丽高山的时候,这本书会大大地帮助你。我非常热情地向您推荐这本着作。当然,再好的书籍只是工具,能不能成功,关键还在你自己。

2016-06-05

STL source code

STL被内建在你的编译系统之内。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。 在C++标准中,STL被组织为下面的17个头文件:<algorithm>、<deque>、<functional>、<iterator>、<array>、<vector>、<list>、<forward_list>、<map>、<unordered_map>、<memory>、<numeric>、<queue>、<set>、<unordered_set>、<stack>和<utility>。 STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。

2016-06-05

设计模式之工厂模式

本程序为简单工厂模式、工厂方法模式、抽象工厂模式的综合代码,详细地讲述了工厂模式的应用,简洁明了!

2015-12-24

SX1278模块

整体程序:sx1278驱动代码 + SPI外设代码 + UARST上位机调试代码 + 测试平台代码(sx12xxEiger) 测试代码链接:http://download.csdn.net/detail/yangquanhui1991/9278731

2015-11-18

BLE-CC41-A蓝牙模块

BLE-CC41-A蓝牙模块是深圳市博陆科电子科技有限公司专为智能无线数据传输而打造, 采用美国TI公司CC2541芯片, 配置 256Kb 空间,遵循V4.0 BLE蓝牙规范。 支持AT 指令,用户可根据需要更改串口波特率、设备名称、 配对密码等参数,使用灵活。 本模块支持UART接口, 有成本低、体积小、具功耗低、收发灵敏高等优点,只需配备性少许的外围元件就能实现其强大功能。

2015-11-18

SX1276/1278LoRa模块测试程序

整体程序:sx1278驱动代码 + SPI外设代码 + UARST上位机调试代码 + 测试平台代码(sx12xxEiger) 本程序主要基于STM32平台; 测试通过!

2015-11-18

BLE-CC41-A蓝牙模块驱动程序

BLE-CC41-A蓝牙模块是深圳市博陆科电子科技有限公司专为智能无线数据传输而打造, 采用美国TI公司CC2541芯片, 配置 256Kb 空间,遵循V4.0 BLE蓝牙规范。 支持AT 指令,用户可根据需要更改串口波特率、设备名称、 配对密码等参数,使用灵活。 本模块支持UART接口, 有成本低、体积小、具功耗低、收发灵敏高等优点,只需配备性少许的外围元件就能实现其强大功能。 代码经过测试通过!

2015-11-18

虚拟化知识

虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

2015-08-18

操作系统:精髓与设计原理02(读书笔记)

本笔记最大的特点就是对操作系统的基本概念解释的很清楚;对操作系统的原理和内容都做了清晰的阐述。同时,还通过列举实际的操作系统(如windows和linux),对某些问题来进一步说明,使得原理和概念性的东西不再那么枯燥。 最后,这本书比Andrew S.Tanenbaum的那本经典的《现代操作系统》还要更加深入一些,不仅可以让读者入门,还可以让读者对操作系统的理解更加的深刻。

2015-07-26

操作系统:精髓与设计原理01(读书笔记)

本笔记最大的特点就是对操作系统的基本概念解释的很清楚;对操作系统的原理和内容都做了清晰的阐述。同时,还通过列举实际的操作系统(如windows和linux),对某些问题来进一步说明,使得原理和概念性的东西不再那么枯燥。 最后,这本书比Andrew S.Tanenbaum的那本经典的《现代操作系统》还要更加深入一些,不仅可以让读者入门,还可以让读者对操作系统的理解更加的深刻。

2015-07-26

空空如也

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

TA关注的人

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