相对全局变量,静态数据成员的优势

1.静态数据成员没有进入程序的全局名字空间,因此不存在程序中其他全局名字冲突的问题

2.使用静态数据成员可以隐藏信息,因为静态成员可以是private,而全局对象不能。


无论在狗仔函数初始化列表中初始化成员,还是在构造函数体内对它们赋值,最终结果相同。

不同:构造函数在初始化列表初始数据成员,没有定义初始化列表的构造函数在构造函数体中对数据成员赋值。

1.const 和引用类型数据成员变量只能被初始化而不能做赋值操作

2.类的构造函数需要调用其基类的构造函数,只能用初始化列表,不能用赋值 eg 在子类构造函数中要初始化父类的private成员,直接赋值不行,只有调用父类的构造函数才能完成对它的初始化。但在函数体内调用父类的构造函数不合法,只能用初始化列表调用子类构造函数的方式

class B : public A

{

B(int x, int y) : A(x)  //需要初始化b及父类的a

  {

a = x;  //错误 a为private

}

}

### 列表原理 列表(Hash Table)是一种基于数组的数据结构,其核心原理是通过一个称为**列函数**的算术操作将键(Key)转换为数组的一个索引,从而实现快速访问数组中的键值对。理论上,列表可以在常数时间复杂度 $ O(1) $ 内完成查找、插入和删除操作,这是其最大的优势之一[^1]。 然而,列表的设计面临两个核心问题: 1. **列函数的设计**:目标是将键尽可能均匀地分布在数组中,以减少冲突的发生。 2. **冲突处理**:由于不同的键可能映射到相同的索引,因此需要设计策略来处理这种冲突。 --- ### 列函数的设计 列函数的设计应遵循以下原则: - **均匀性**:尽量使键值分布均匀,减少冲突。 - **确定性**:相同的键必须始终映射到相同的索引。 - **高效性**:计算速度要快,不影响整体性能。 常见的列函数包括除留余数法、乘留余数法、数字分析法等。例如,对于整数键,通常使用 `key % tableSize` 作为列值,其中 `tableSize` 是列表的大小[^1]。 --- ### 冲突解决方法 当两个或多个键被列到同一个索引时,就会发生**冲突**。常见的冲突解决方法包括: #### 1. 拉链法(Separate Chaining) 每个列表索引对应一个链表,当发生冲突时,将键值对插入到该索引对应的链表中。这种方法实现简单,且可以有效处理冲突。 ```python class HashTable: def __init__(self, size): self.size = size self.table = [[] for _ in range(size)] def hash_function(self, key): return key % self.size def insert(self, key, value): index = self.hash_function(key) for pair in self.table[index]: if pair[0] == key: pair[1] = value return self.table[index].append([key, value]) ``` #### 2. 线性探测法(Linear Probing) 当发生冲突时,线性探测法会从当前索引开始,依次向后查找,直到找到一个空槽来存放键值对。这种方法需要处理“聚集”问题,即多个键集中在同一区域,影响性能。 ```python class HashTable: def __init__(self, size): self.size = size self.keys = [None] * size self.values = [None] * size def hash_function(self, key): return key % self.size def insert(self, key, value): index = self.hash_function(key) while self.keys[index] is not None: if self.keys[index] == key: self.values[index] = value return index = (index + 1) % self.size self.keys[index] = key self.values[index] = value ``` #### 3. 溢出区法(Overflow Area) 将所有冲突的键值对存储在一个公共的溢出区中。查找时,先在主列表中查找,若未找到,则在溢出区中查找。此方法实现简单,但会增加查找时间[^4]。 --- ### 列表的局限性 尽管列表具有高效的查找性能,但在以下情况下应避免使用: - **大量冲突**:当冲突频繁发生时,列表的性能会下降,甚至失去 $ O(1) $ 的时间优势[^2]。 - **范围查找**:列表不适合进行范围查找(如查找最大值或最小值),因为键值对是无序存储的[^2]。 --- ### 实际应用 列表广泛应用于: - **缓存系统**:如 Redis 使用哈希表实现快速键值存储。 - **数据库索引**:用于加速数据检索。 - **集合操作**:如去重、交集、并集等。 此外,列表还可以与其他数据结构结合,例如链表、位图等,以解决复杂的数据处理问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值