C++沉思录读书笔记 12-设计容器类

容器是一种保存值的集合的数据结构。C有两种内建的容器:数组和结构体。C++可以提供更多的容器(但是没有)。C++提供给用户写自己的容器的方法。

 

1. 包含什么

容器包含放在其中的对象的副本,而不是原对象本身。想保存对象标识的用户(想在多个容器中包含同一对象的用户)可以把指向该对象的指针放入到容器中。

向容器中复制值而不是原对象正是内建数组的工作模式。

 

2. 复制容器意味着什么

通常将容器成为模板,而容器内的对象的类型就是模板参数。

数组不允许赋值操作,不能由一个数组初始化另一个数组。

CC++中的内建集合都实现了两种不同的方法,复制对于这两种方法来说含义各不相同:

(1)结构体实现值语义:复制完成后,两个变量都有这个值的独立的副本。

(2)数组实现引用语义:复制完成后,两个变量都引用同一个底层对象。

如果复制容器只不过简单地使两个容器指向同一个底层对象,而不是复制容器内的元素,那么效率就会提高很多。

对于这条通用的规则而言,有一点例外,即当容器本身的类型表明了有关复制应该创建一个新值,还是复制指向同一个底层对象的引用的信息。

 

3. 怎样处理容器的增长

如果我们没有把取出和存储的操作分开来,那么,当我们要保存某个不存在的元素时,容器的表现应当与试图取出一个不存在的元素时相同。一种合理的方法是提供一种手段来显式地创建新的容器元素,然后再有人企图在没有创建元素前就想访问该元素的时候抛出异常。还有一种方法是简单地获得一些常规的值。即访问包含类T的对象的容器中一个不存在的值,将得到T()的值。

设计有逐步扩展能力的容器时,要考虑如何为容器中的元素分配内存,以避免在通常情况下产生不能承受的开销。


区块chunk

 迭代器 iterator

 

4. 容器和继承

数组和继承不可以混合使用。问题在于C数组假定它们的元素都是同样大小的。C数组知道存储在其中的对象的类型,并根据该类型的对象的大小从一个元素找到另一个元素。因为通过继承相互关联的类型大小可以不相同,所以,当基类类型的数组用来存储某个从该基类派生出来的类型的对象时,就容易出问题。

 

5. 设计一个类似数组的类

内建数组既不能被赋值也不能被复制。

 

指针和下标的区别:

(1)下标容易理解,指针效率更高

(2)在使用下标的例子中,下标值本身就有意义,而与它是否用作下标无关。

(3)在使用指针的例子中,要访问容器的元素没有必要知道容器的标识:指针自身就包含了所有必要的信息。

 

程序只要拥有一个指向数组元素的指针,就可以访问整个数组,而通过下标进行元素访问的程序就要另外知道正在使用哪个数组。

“几个数组的对应元素”的概念在使用下标实现的时候远比使用指针更有效。

释放数组时,会不通知指针的所有者,一次性使所有指向数组元素的指针失效,而下标则仍然保有其意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值