/images/avatar.png

[读书笔记] stl源码剖析 第一章、第二章 概论、内存配置器

概论

第一章基本都是C++基础的知识,读了《C++ Primer》的话都懂。关于各种C++的特性、STL特性都有。

STL六大组件 功能与运用

STL提供六大组件,彼此可以组合套用

  1. 容器:各种数据结构。Vector,list,deque,set,map
  2. 算法:各种常用算法如sort,search,copy,erase
  3. 迭代器:扮演容器与算法之间的粘合剂,所谓的泛型指针。五种类型
  4. 仿函数:行为类似函数,可以作为算法的某种策略。仿函数是重载了()的class或者class template,一般函数指针可视为狭义的仿函数
  5. 配接器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  6. 配置器:负责控件的配置与管理。

阅读谷歌编程规范

事情的起因

好的东西就是这样,你每次看都能够有新的收获。 这次也一样,读了一遍谷歌编程规范,又有些新的理解,也有一些需要重新让自己记住的点。 遂记录下来,成此博文。

windows下Pyqt + guiqwt环境的搭建

事情的起因

这几天为了搭一个PyQt的生产环境遇到了好一些坑。 本身搭建PyQt的目的是为了进行试验,使用PyQt开发曾经开发过的项目的难度。 原项目是使用MFC开发,利用自己开发的折线绘制控件,进行高速的工控数据采集后,显示到界面上。难点主要在,高速采集之后,绘图的效率问题。 最终通过自己开发了一套平移显示绘图控件,在新增数据的时候,每一次只绘制一部分数据,然后通过平移之前的图像与之后的链接在一起,这样达到比较高的绘图效率,才解决了问题。但是MFC界面开发复杂,在MFC界面上花费过多的时间。同时本身绘图控件的开发,可能可以利用现有开源控件进行开发来避免重复造轮子。 于是利用PyQt+guiqwt绘图库来开发的方案构建起来。guiqwt本身是QT下常用的绘图控件,效率足够高,经过一些优化是能够使用的。相对Python经常使用的matplotlib来说不够漂亮,但是进行实时数据的平移绘图,效率高出很多。PyQt是模仿QT写的图形库,可以利用QTCreate进行快速的界面构建,而Python相对C++来说,需要处理的坑更少,出现各类崩溃的异常的情况会更少一些。 本文主要讲的是PyQt+guiqwt在windows上的搭建。 目的是在之后能够通过本文进行快速的开发环境的搭建。

[读书笔记] sicp 第三章 模块化 对象和状态

有效的程序综合还需要一些组织原则,它们能够指导我们系统化地完成系统的整体设计。特别的需要一些能够帮助我们构造起模块化的大型系统策略,也就是说,使这些系统能够“自然地”划分为一些具有内聚力的部分,使这些部分可以分别进行开发和维护。 有一种非常强有力的设计策略,特别适合用于构造那类模拟真实物理系统的程序,那就是基于被模拟程序的结构去设计程序的结构。那么有关的物理系统里的每一个对象,我们构造起一个与之对象的计算对象;对该系统里的每种活动,我们在自己的计算系统里顶一种符号操作。采用这一策略时的希望是,在需要针对系统中的新对象或者新活动扩充对应的计算模型时候,我们能够不必对程序的组织方面做得很成功,那么在需要添加新特城或者排除旧东西里的错误时候,就只需要在系统里的一些小局部中工作。 本章研究两种特点鲜明的策略。第一种策略将注意力集中在对象上,将大型系统看成一大批对象,它们的行为可能随着时间的进展而不断的变化。另一种组织策略将注意力集中在流过的系统的信息流上,非常像电子工程师观察一个信号处理系统。 对于对象途径而言,我们必须关注计算对象可以怎样变化而又同时保持其标识。这将迫使我们抛弃老的计算的代换模型,转向更机械式的,理论上也更不同意把握的计算的环境模型。在处理对象、变化和标识时,各种困难的基本根源在于我们需要在这一计算模型中与时间搏斗。如果允许程序并发指向的可能性,事情会变得更困难许多。流方式特别能用于松解在我们模型中对时间的模拟与计算机求值过程中的各种时间发生的顺序。我们将通过一种称为延时求值的技术做到这一点。

赋值和局部状态

一个由许多对象组成的系统里,其中的这些对象极少会是完全独立的。每个对象都可能通过交互作用,影响其他对象的状态,所谓交互就是建立起一个对象的状态变量与其他对象的状态变量之间的联系。确实如果一个系统中的状态变量可以分组,形成一些内部紧密结合的子系统,每个子系统与其他子系统之间只存在松散的练习,此时将这个系统看作是由一些独立对象组成的观点就会特别有用。 对于一个系统的这种观点,有可能成为组织这一系统的计算模型的有力框架。要使这样的一个模型成为模块化的,就要求它能够分解为一批计算对象,使它们能够模拟系统里的实际对象。每个计算对象必须有它自己的一些局部状态变量,用于描述实际对象的状态。对于被模拟系统里的对象的状态是随着时间的变化的,与它们对象的计算对象的状态也必须变化。

[读书笔记] sicp 第二章 带有通用型操作的系统

通用型算术运算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
(define (add x y) (apply-generic 'add x y))
(define (sub x y) (apply-generic 'sub x y))
(define (mul x y) (apply-generic 'mul x y))
(define (div x y) (apply-generic 'div x y))

(define (install-scheme-number-package)
  (define (tag x)
    (attach-tag 'scheme-number x))
  (put 'add '(scheme-number scheme-number)
       (lambda (x y) (tag (+ x y))))
  (put 'sub '(scheme-number scheme-number)
       (lambda (x y) (tag (- x y))))
  (put 'mul '(scheme-number scheme-number)
       (lambda (x y) (tag (* x y))))
  (put 'div '(scheme-number scheme-number)
       (lambda (x y) (tag (/ x y))))
  (put 'make '(scheme-number scheme-number)
       (lambda (x) (tag x)))
  'done)
  
  (define (make-scheme-number n)
  ((get 'make 'scheme-number) n))

利用同样的方法可以加入有理数/复数等操作

[读书笔记] sicp 第二章 抽象数据的多重表示

对于一个数据对象可以能存在多种有用的表示形式,而且我们也希望所涉及的系统能够处理多种表示形式。 例子:复数的极坐标形式和直角坐标的形式 构造通用型过程:可以在不止一种数据表示上操作的过程。采用的技术:让它们在带有类型标志的数据对象上工作。也就是说,让数据对象包含着它们应该如何处理的明确信息。

复数的表示

为一个数据提供了多种操作,存在多种形式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
(define (real-part z) (car z))

(define (imag-part z) (cdr z))

(define (magnitude z)
  (sqrt (+ (square (real-part z)) (square (imag-part z)))))

(define (angle z)
  (atan (imag-part z) (real-part z)))

(define (make-from-real-imag x y) (cons x y))

(define (make-from-mag-ang r a)
  (cons (* r (cos a)) (* r (sin a))))

(define (add-complex z1 z2)
  (make-from-real-imag (+ (real-part z1) (real-part z2))
                       (+ (imag-part z1) (imag-part z2))))

(define (sub-complex z1 z2)
  (make-from-real-imag (- (real-part z1) (real-part z2))
                       (- (imag-part z1) (imag-part z2))))

(define (mul-complex z1 z2)
  (make-from-mag-ang (* (magnitude z1) (magnitude z2))
                     (+ (angle z1) (angle z2))))

(define (div-complex z1 z2)
  (make-from-mag-ang (/ (magnitude z1) (magnitude z2))
                     (- (angle z1) (angle z2))))