泛型算法

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使用。

C++学习笔记6的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. Android Fragment StartActivityForresult调用实例

    fragment里面的onActivityResult 怎样才能被调用,很简单,就一句话, startActivityForResult(intent, getActivity().RESULT_FI ...

  2. Matlab插值计算各时刻磁法勘探日变观测值

    Matlab插值计算各时刻磁法勘探日变观测值 在磁法勘探中,消日变影响的改正称为日变改正.进行日变改正时必须设立日变站,观测日变情况.根据日变数据和测点观测时间,对观测数据进行改正. 在本次磁法实习中 ...

  3. ALOS卫星介绍

    ALOS卫星介绍 作者:ALOS    文章来源:ALOS    点击数:    更新时间:2013-6-21 摘要:日本地球观测卫星计划主要包括2个系列:大气和海洋观测系列以及陆地观测系列.先进对地 ...

  4. android权限列表

    原文:[转]android权限列表 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略 ...

  5. perl 解json数组

    <pre name="code" class="cpp">http://11.36.10.82:4000/api/bus?bus=307&f ...

  6. MyEclipse修改

    MyEclipse设置编码方式 http://www.cnblogs.com/susuyu/archive/2012/06/27/2566062.html Eclipse添加Spket插件实现ExtJ ...

  7. append与after

    apend与apendTo就如同after与insertAfter,表达意思相同,表达不同.A.after(B)=B.insertAfter(A).apend在元素里面添加,after在元素外面添加. ...

  8. css3幻灯片换位效果

    <title>css3幻灯片换位效果</title> <style type="text/css">  .flowGallery {width: ...

  9. [Android]The connection to adb is down, and a severe error has occured.

    在Android开发时,有时我们开启虚拟机执行程序时.会报类似下面错误: [2015-07-19 15:08:29 - TestXiaoYanLibrary] The connection to ad ...

  10. SQL2008缩小日志脚本

    以下为SQL2008 缩小日志文件的脚本,在SQL Server Management Studio中打开数据库,将脚本里的数据库名称替换成需要缩小日志的库名称,然后 运行以下脚本. USE WSS_ ...