C++ 中的 lambda 表达式

lambda 表达式是函数式编程语言中一个很 cool 的特性,而 C++11 标准加入了对 lambda 表达式的支持。本篇文章对 C++11 中的 lambda 表达式做一个简单的介绍。



什么是 lambda 表达式

说到 lambda expression 就不能不提 lambda calculus,前者是从后者中衍生出的概念,lambda calculus 有着严格的数学定义,与图灵机有着等价的计算能力。这里只介绍编程语言中的 lambda 表达式概念。

在函数式编程语言中,函数是一等公民。有时我们需要一个函数,但又不想要定义一个具有名字的函数,即我们需要一个匿名函数,而一个 lambda 表达式实际上就是通过表达式的方式定义了一个匿名函数。

More

旋转矩阵与四元数

在计算机图形学的学习中,几何变换(Transformations)是一块重要的内容,我们使用齐次坐标(Homogeneous coordinates)描述点和向量,使用变换矩阵描述平移、旋转等变换。

而在平移、旋转、缩放这几种变换中,又以旋转的情况最为复杂。实际上,计算机图形学中三维空间的旋转不仅仅有旋转矩阵一种表达形式,欧拉角(Euler angles)和四元数(Quaternions)也是常用的方法。

More

Kinect开发环境配置:Kinect for Windows SDK + OpenCV2.4.9 + VS2013 + Win8(x86)

OS为Windows 8 32位,VS2013已安装并可以正常使用。

一. 安装和配置Kinect for Windows SDK v1.8

官方网站下载Kinect for Windows SDKDeveloper Toolkit

KinectSDK-v1.8-Setup.exe (主要提供Kinect的驱动和设备访问接口)

KinectDeveloperToolkit-v1.8.0-Setup.exe (主要提供一些有助于开发的工具,包括Kinect Studio和多种编程语言的开发例程等)

More

<餐巾纸上的创业课>读书笔记

https://book.douban.com/subject/4168140/

很喜欢这种风格,把很多道理融入在故事中,让人忍不住一口气读完。下面是从中摘录的一些笔记:

每个公司企业看似都有自己独特的成长模式,其实这些模式顶多不过三四种。

创业,失败率高达90%以上

地雷总埋藏在你意想不到的地方

没有人能带着成功全身而退。

扁平化组织:老板必须拥有绝对的领导地位。管理部门完全听从老板的指示行事,没有实权。

我们必须熟知模式,才有跳脱模式发展自己的可能;要知道自己正走在埋有地雷的道路上,遇上时才能够妥善处理。

More

Ruby Quick Start (4) -- Array, String, Closure

《Ruby语言入门教程v1.0》笔记(4)


第八章 Ruby中的数组、字符串、闭包

1. Ruby中的数组

1.1 建立数组

arr1 = []
arr2 = Array.new
arr3 = ['4 ', '5 ', '6 ']
print arr1, "\n"
print arr2, "\n"
print arr3, "\n"


1.2 访问数组元素

arr = [3, 4, 5, 6, 7, 8, 9]
puts arr[0]    # 3
puts arr.first    # 3
puts arr[arr.length-1]    # 9
puts arr[arr.size-1]    # 9
puts arr.last    # 9
puts arr[-1]    # 9
puts arr[-2]    # 8
print arr[1..3] ,"\n"    # 456
print arr[-3, 2] ,"\n"    # 78

数组的索引从 0 开始,一直到数组的长度减去 1

负数表示从数组末尾开始的索引;

用一对数字来索引数组,第一个数字表示开始位置,第二数字表示从开始位置起的元素数目。



1.3 增加、删除数组元素

Ruby 的数组大小是动态的,你能够随时增加、删除数组元素。

More

Ruby Quick Start (3) -- Module, Mix-in

《Ruby语言入门教程v1.0》笔记(3)



第六章 模块、命名空间、Mix-in

1. Ruby中的模块

在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。

把功能相关的程序代码放在一个模块里, 体现了模块的第一个作用: 可以被其它程序代码重复使用。

数学中常用的函数, Ruby 中的 Math 模块都提供了。 每个使用 Math 模块的程序员无须再重复编写这些常用的函数与常数。

puts Math.sqrt(2)    # 1.4142135623731
puts Math::PI    # 3.14159265358979

定义模块用 module...end

模块与类非常相似,但是:

  • 模块不可以有实例对象;
  • 模块不可以有子类。

    More

Notes of Scala course on Coursera -- Week 3

Here are my notes for the week 3’s lecture of Functional Programming Principles in Scala on Coursera.




1. Class Hierarchies

1.1 Abstract Classes

Consider the task of writing a class for sets of integers with the following operations.

abstract class IntSet {
  def incl(x: Int): IntSet
  def contains(x: Int): Boolean
}

IntSet is an abstract class.

Abstract classes can contain members which are missing an implementation (in our case, incl and contains ).

Consequently, no instances of an abstract class can be created with the operator new.



1.2 Class Extensions

Let’s consider implementing sets as binary trees.

There are two types of possible trees: a tree for the empty set, and a tree consisting of an integer and two sub-trees.

Here are their implementations:

class Empty extends IntSet {
  def contains(x: Int): Boolean = false
  def incl(x: Int): IntSet = new NonEmpty(x, new Empty, new Empty)
}

class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet {
  def contains(x: Int): Boolean =
    if (x < elem) left contains x
    else if (x > elem) right contains x
    else true
  def incl(x: Int): IntSet =
    if (x < elem) new NonEmpty(elem, left incl x, right)
    else if (x > elem) new NonEmpty(elem, left, right incl x)
    else this
}

Empty and NonEmpty both extend the class IntSet .

This implies that the types Empty and NonEmpty conform to the type IntSet

  • an object of type Empty or NonEmpty can be used wherever an object of type IntSet is required.


More

Ruby Quick Start (2) -- Objects in Ruby

《Ruby语言入门教程v1.0》笔记(2)


第四章 Ruby面向对象初探

1. 封装

让我们来定义一个类, 类名是 Person类名首字母要大写; 属性有姓名@name、年龄@age、国籍@motherland,实例变量用@开头;
方法有一个,叫 talk, 方法名和参数名应该用一个小写字母开头或者用一个下划线开头。

class Person
  def initialize(name, age = 18)
    @name = name
    @age = age
    @motherland = "China"
  end  # 初始化方法结束
  def talk
    puts "my name is " + @name + ", age is " + @age.to_s
    if @motherland == "China"
      puts "I am a Chinese."
    else
      puts "I am a foreigner."
    end
  end  # talk方法结束
  attr_writer :motherland  # @motherland的setter
end

p1 = Person.new("Yilin", 23)
p1.talk

p2 = Person.new("Ben")
p2.motherland = "ABC"
p2.talk

initialize 是初始化方法,相当于构造函数。
参数 age 有一个缺省值 18,可以在任何方法内使用缺省参数,而不仅仅是 initialize。 如果有缺省参数, 参数表必须以有缺省值的参数结尾。

注意我们定义了@motherland成员变量的setter:

More

Ruby Quick Start (1) -- A Glimpse of Syntax

学习Ruby时在网上找到了一本小册子《Ruby语言入门教程v1.0》,虽然是07年的东西了,但是作为快速熟悉Ruby基本语法还是很有帮助的,做一下笔记。

开始前先问下自己两个问题。

(1) 我为什么要学习Ruby?

为了Web开发。

(2) 为什么选择Ruby,而不是Python,PHP?

看了知乎上的这个答案

  • 假如你想帮他尽快找个活儿, 赚到钱, 推荐 PHP
  • 假如你想让他成为一个高效工程师, 推荐 Python
  • 假如你想让他爱上他的工作, 推荐 Ruby

无论如何,别人的答案只能作为参考,自己尝试过后才有资格评价,所以最好的方法就是亲自动手学习下Ruby。

More

《编写高质量代码:改善C++程序的150个建议》读书笔记(2)

《编写高质量代码——改善C++程序的150个建议》读书笔记(1)



第二部分 编码习惯和规范篇

建议81:避免无意中的内部数据裸露

对于const成员函数,不要返回内部数据的句柄,因为它会破坏封装性,违反抽象性,造成内部数据无意中的裸露,这会出现很多“不可思议”的情形,比如const对象的非常量性。

建议82:积极使用const为函数保驾护航

const的真正威力体现在几个方面:

  1. 修饰函数形式的参数:const只能修饰输入参数,对于内置数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”;
  2. 修饰函数返回值;
  3. 修饰成员函数:用const修饰成员函数的目的是提高程序的健壮性。const成员函数不允许对数据成员进行任何修改。

关于const成员函数,须遵循几个规则:

  1. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数;
  2. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的;
  3. const成员函数不可以修改对象的数据,不管对象是否具有const性质。

建议83:不要返回局部变量的引用

局部变量的引用是一件不太靠谱的事儿,所以尽量避免让函数返回局部变量的引用。同时也不要返回new生成对象的引用,因为这样会让代码层次混乱,让使用者苦不堪言。

建议84:切忌过度使用传引用代替传对象

相较于传对象,传引用的优点:它减少了临时对象的构造与析构,所以更具效率。但须审慎地使用传引用替代传对象,必须传回内部对象时,就传对象,勿传引用。

建议85:了解指针参数传递内存中的玄机

用指针参数传回一块动态申请的内存,是很常见的一种需求。然而如果不甚小心,就很容易造成严重错误:程序崩溃+内存泄露,解决之道就是用指针的指针来传递,或者换种内存传递方式,用返回值来传递。

// 指针型变量在函数体中需要改变的写法
void f(int *&x)    // 使用指针变量的引用
{
    ++x;
}

More