深入实践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++标准库中容器,迭代器及算法的最主要设计思想----以迭代器为界,分隔容器与算法,也就是将容器和算法的耦合性降到最低。
容器是将某种数据进行组织和存储的集合,面向对象中一般设计成一个类来实现。
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++标准库中容器,迭代器及算法的最主要设计思想----以迭代器为界,分隔容器与算法,也就是将容器和算法的耦合性降到最低。
相关文章推荐
- c语言基础:各种数据类型的输出占位符
- c++ 全排列
- C语言SOCKET获取本机所有IP
- C语言使用socket通过IP138获取外网IP
- 【C++】1.1 VS中关于工程的使用
- 15 Essential Compilers and IDEs for C/C++ Programmers
- Visual C++设计超强仿QQ自动伸缩窗口
- c语言的cgi编译全过程
- 数据库在C++程序中使用方法
- 【C++】1. 创建C++工程
- C语言itoa()函数
- 基类指针和派生类指针的使用总结
- C++中四种类型转换运算符的使用方法
- C语言socket send()数据缓存问题
- 记一道c语言题
- C++中的ostringstream、istringstream、stringstream类
- 学习C++
- C++拾遗
- [原]C++拾遗
- VdcEye manager