0%

数据结构

相互之间存在一种或多种特定关系的数据元素的集合。研究数据结构,关心的是数据对象的描述以及相关操作函数的实现。

数据

是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。如整型、浮点型等数值类型,以及声音、图像等非数值类型。

数据元素

是组成数据的、具有一定意义的基本单位,在计算机中通常作为整体处理。也被称作记录。

阅读全文 »

5章:实现

条款26:尽可能延后变量定义式的出现时间
  • 应该延长变量的定义,直到非得使用它时
  • 应该延后这份定义,直到能够给它初值实参

对于循环存在的情况:

  • 做法A:定义于循环外

    1
    2
    3
    4
    5
    6
    Widget w;
    for(int i = 0; i < n; i++)
    {
    w = 取决于 i 的某个值;
    ...
    }
  • 做法B:定义于循环内

    1
    2
    3
    4
    5
    for(int i = 0; i < n; i++)
    {
    Widget w(取决于 i 的某个值);
    ...
    }

    这两种写法的成本如下:

    • 做法A1个构造函数 + 1个析构函数 + n个赋值操作

    • 做法Bn个构造函数 + n个析构函数

    • 做法A会造成名称w的作用域比做法B更大

      除非(1)你知道赋值成本比构造 + 析构成本低,(2)你正在处理代码中效率高度敏感的部分,否则你应该使用做法B

阅读全文 »

4章:设计与声明

条款18:让接口容易被正确使用,不容易被误用
  • 如果客户企图使用某个接口却没有获得所预期的行为,这个代码不应该通过编译;如果代码通过了编译,则它的行为就应该是客户想要的
  • 欲达“让接口容易被正确使用,不容易被误用”的目的,必须考虑客户调用接口时可能做出什么样的错误
  • “促进正确使用”的办法包括接口的一致性,以及与内置类型兼容
  • “阻止误用”的办法包括建立新类型、限制在类型上的操作,束缚对象值以及消除客户的资源管理责任
阅读全文 »

3章:资源管理

条款13:以对象管理资源
  • RAII(Resource Acquisition Is Initialization)

    使用new获取资源后于同一条语句内以它初始化某个资源管理对象。利用当管理对象离开作用域被销毁时自动调用其析构函数的机制确保资源被释放。不直接用newdelete,多用智能指针。

  • 智能指针在其析构函数中做delete动作而非delete[]动作

    因此,不要在动态分配来的数组身上使用智能指针(虽然它仍然会通过编译)。

阅读全文 »

2章:构造、析构、赋值运算

条款05:了解C++默默编写并调用哪些函数
  • 编译器会暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数

  • 对于class内含reference成员或const成员,编译器拒绝为其生成copy构造函数和copy assignment操作符

    因为C++不允许reference改指向不同的对象以及更改const成员。

阅读全文 »

1章:让自己习惯C++

条款01:视C++为一个语言联邦
  • C++视为由4个次语言组成的联邦:
    • C:没有模板、没有异常、没有重载…
    • Object-Oriented C++:类、封装、继承、多态、虚函数、动态绑定等等;
    • Template C++:泛型编程部分;
    • STL:是一个Template程序库,容器、迭代器、算法以及函数对象。

从某个此语言切换到另一个时,高效编程守则可能会发生变化。比如,C-like类型(内置类型)pass by value更好;对于Object-Oriented C++而言,pass by reference to-const更好;再切换到STL,由于迭代器和函数对象都是在C指针之上塑造出来的,pass by value守则再次适用。

阅读全文 »