泛型算法
1. 算法怎样工作
每一个泛型算法的实现都独立于单独的容器。这些算法还是大而不全的,而且不依赖于容器存储的元素类型。为了知道算法怎样工作,让我们深入了解find 操作。该操作的任务是在一个未排序的元素集合中查找特定的元素。从概念上看,find必须包括下面步骤:
1. 顺序检查每一个元素。
2. 假设当前元素等于要查找的值,那么返回指向该元素的迭代器。
3. 否则,检查下一个元素,反复步骤2,直到找到这个值,或者检查全然部的元素为止。
4. 假设已经到达集合末尾,并且还未找到该值,则返回某个值,指明要查找的值在这个集合中不存在。
2. 排序算法
标准库定义了四种不同的排序算法,上面仅仅使用了最简单的sort 算法,
使words 按字典次序排列。除了sort 之外,标准库还定义了stable_sort 算法,stable_sort保留相等元素的原始相对位置。通常,对于已排序的序列,我
们并不关心其相等元素的相对位置,毕竟,这些元素是相等的。可是,在这个应用中,我们将“相等”定义为“同样的长度”,有着同样长度的元素还能以字典
次序的不同而区分。调用stable_sort 后,对于长度同样的元素,将保留其字典顺序。
3. 类定义
最简单地说,类就是定义了一个新的类型和一个新作用域。每一个类能够没有成员,也能够定义多个成员,成员能够是数据、函数或类型别名。
在类内部,声明成员函数是必需的,而定义成员函数则是可选的。在类内部定义的函数默觉得 inline
在类外部定义的成员函数必须指明它们是在类的作用域中。
Sales_item::avg_price 的定义使用作用域操作符来指明这是 Sales_item类中avg_price 函数的定义。
4. 将keywordconst 加在形參表之后,就能够将成员函数声明为常量:
double avg_price() const;
const 成员不能改变其所操作的对象的数据成员。const必须同一时候出如今声明和定义中,若仅仅出如今当中一处,就会出现一个编译时错误。
5. 数据抽象
数据抽象是一种依赖于接口和实现分离的编程(和设计)技术。类设计者必须关心类是怎样实现的,但使用该类的程序猿不必了解这些细节。
相反,使用一个类型的程序猿仅需了解类型的接口,他们能够抽象地考虑该类型做什么,而不必详细地考虑该类型怎样工作。
6. 封装
封装是一项低层次的元素组合起来的形成新的、高层次实体珠技术.函数是封装的一种形式,。相同地,类也是一个封装的实体.被封装的元素隐藏了它们的实现细节——能够调用一个函数但不能訪问它所运行的语句。
6. 訪问标号
能够在随意的訪问标号出现之前定义类成员。在类的左花括号之后、第一个訪问标号之前定义成员的訪问级别,其值依赖于类是怎样定义的。
假设类是用struct keyword定义的,则在第一个訪问标号之前的成员是公有的;假设类是用class keyword是定义的,则这些成员是私有的。
一个訪问标号能够出现的次数一般是没有限制的。每一个訪问标号指定了随后的成员定义的訪问级别。这个指定的訪问级别持续有效,直到遇到下一个訪问标号或看到类定义体的右花括号为止。
7. 数据抽象和封装提供了两个重要长处:
• 避免类内部出现无意的、可能破坏对象状态的用户级错误。
• 随时间推移能够依据需求改变或缺陷(bug)报告来完美类实现,而无须改变用户级代码。
8. 类声明与类定义
一旦遇到右花括号,类的定义就结束了。而且一旦定义了类,那以我们就知道了全部的类成员,以及存储该类的对象所需的存储空间。
在一个给定的源文件里,一个类仅仅能被定义一次。假设在多个文件里定义一个类,那么每一个文件里的定义必须是全然同样的。
9. 能够声明一个类而不定义它:
class Screen; //declaration of the Screen class
这个声明,有时称为前向声明(forwarddeclaraton),在程序中引入了类类型的Screen。在声明之后、定义之前,类Screen 是一个不全然类型(incompetetype),即已知Screen 是一个类型,但不知道包括哪些成员。
不全然类型(incompletetype)仅仅能以有限方式使用。不能定义该类型的对象。不全然类型仅仅能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形參类型或返回类型的函数。
在创建类的对象之前,必须完整地定义该类。必须定义类,而不仅仅是声明类,这样,编译器就会给类的对象预定对应的存储空间。相同地,在使用引用或指针訪问类的成员之前,必须已经定义类。
10. 为类的成员使用类声明
仅仅有当类定义已经在前面出现过,数据成员才干被指定为该类类型。假设该类型是不全然类型,那么数据成员仅仅能是指向该类类型的指针或引用。
class LinkScreen { Screen window; LinkScreen *next; LinkScreen *prev; };
由于仅仅有当类定义体完毕后才干定义类,因此类不能具有自身类型的数据成员。然而,仅仅要类名一出现就能够觉得该类已声明。因此,类的数据成员能够是指向自身类型的指针或引用:
11. 类对象
定义一个类时,也就是定义了一个类型。一旦定义了类,就能够定义该类型的对象。
定义对象时,将为其分配存储空间,但(一般而言)定义类型时不进行存储分配:
class Sales_item { public: // operations onSales_item objects private: std::string isbn; unsigned units_sold; double revenue; };
定义了一个新的类型,但没有进行存储分配。
12. 定义类类型的对象
定义了一个类类型之后,能够按下面两种方式使用。
• 将类的名字直接用作类型名。
• 指定keywordclass 或struct,后面跟着类的名字:
Sales_item item1; //default initialized object of type Sales_item class Sales_itemitem1; // equivalent definition of item1
两种引用类类型方法是等价的。另外一种方法是从C 继承而来的,在C++ 中仍然有效。第一种更为简练,由C++ 语言引入,使得类类型更easy使用。