您的位置:首页 > 编程语言 > C语言/C++

深入实践c++模板编程 第5章,容器、迭代器与算法。读书笔记。

2014-05-02 18:50 399 查看
  1.容器定义

   容器是将某种数据进行组织和存储的集合,面向对象中一般设计成一个类来实现。

  2.容器实现

    弱类型的动态语言,本身对数据类型不敏感,所提供的容器类天然支持多种数据类型。有的语言还可以在同一容器保存不同类型的数据,实现异质容器,比如python。对于强类型语言,变量和函数参数的类型固定不变,对设计一个支持多种数据类型的容器形成障碍。C++引入模板使得C算法和数据结构的设计可以摆脱对具体数据类型的依赖。

    a.java实现方法

由于java所有类都继承自Object类,使得java可以单一容器接纳多种数据类型。同过上转义(upcast)成为一个基类实例(Object实例),想重新引用时必须在下转义成所需需的数据类型。这就导致了一个潜在的错误。比如,将类A上转义成Object实例,之后下转义成另一个类B,导致了危险的类型转换。

后来java在Java SE 1.5版本引入了一个新的语言--泛型(Generic),它可以约束容器只接纳一种数据类型。虽然和C++的泛型有点相似,但他们有本质的区别。C++根据不同的模板参数生成不同的实例,而java只是对泛型容器的存取增加一条类型约束。

    b.C++实现

C++用模板来实现容器。它是由C++语言本身所决定的。

  3.容器和迭代器

    容器的作用主要是保存数据,因此需要提供对数据存储的接口(界面)。一般此类数据存储界面以单独的类模板形式存在,统称为迭代器(iterator)。C++的迭代器的使用方法大多模仿自然数组指针。为了兼容数组操作,迭代器的操作界面通常通过重载各种运算符来尽量模拟数组指针。

  4.迭代器与算法

    迭代器将各种容器内的数据都虚拟成一个序列,为算法提供一个统一的抽象界面,使得算法可以最大限度从数据结构中剥离出来。

  5.容器和迭代器的分类

    序列型容器:数据存储的位置与其内容完全无关。

        关系型迭代器:数据存储的位置与其内容关联。

        前向迭代器:通过自加操作指向下一个数据。

        双向迭代器:顾名思义,即可指向下一个,、又可指向前一个。

       随机迭代器:不仅可以指向前,指向后,还可以直接跳到前后第若干数据处。

    6.迭代器陷阱

      迭代器的使用存在迭代器与容器非一致以及迭代器指向冲突的错误(多个迭代器指向同一个数据,其中某一个迭代器将该数据删除,导致其他的迭代器的操作产生未知后果)。

    7.总结

       容器,迭代器与算法的设计模式是C++中重要的通用代码实现方法。这一切的实现,都要依赖于模板。

      C++标准库中容器,迭代器及算法的最主要设计思想----以迭代器为界,分隔容器与算法,也就是将容器和算法的耦合性降到最低。

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: