一、STL容器分类
二、容器的共通能力和共通操作
- 所有容器提供value语义而不是reference语义。容器内部进行安插动作实施的是copy或move,而不是管理元素的reference。如果要存放的对象不具有public copy构造函数,或者要做的不是复制,那么就只能使用move操作,要么容器元素就必须是pointer或“用以指向对象”的pointer object。
- 元素间多次迭代结果相同
- 不提供错误处理机制
三、顺序容器
四、关联容器
关联容器默认比较方法"<"
如果关联容器存储的key值是用户自定义类,用户需要重载"<"运算符以便容器能够正确的比较出key的大小进而进行数据存取。
无序关联容器的hash方式
由于无序关联容器的实现是基于hash函数,那么就需要解决冲突问题,解决冲突的办法比较常用有开放地址法和拉链法。在C++的unordered_map当中,采用的是”桶(bucket)”的方法,也就是出现冲突的元素都存放在一个桶里。桶内的元素是用链表连接的。
无序关联容器提供用户自定义hash函数
所有hash_table都需要一个hash函数,将放入元素的value映射到某个相关的bucket。
STL中使用用户自定义的hash函数有一定的编写要求:
- hash函数必须是个函数或者function object,它接受一个元素类型下的value作为参数,返回一个类型为std::size_t的value。bucket的当前数量未被考虑时需要将函数返回值映射到bucket索引范围内。(意思即hash表大小有限,不能超出表大小)
- 示例:
class Customer{
...
}
class CustomerHash{
public:
std::size_t operator() (const Customer& c)const{
return ...
}
}
五、STL容器比较
默认应该使用vector:
- vector内部结构最简单
- vector支持随机访问
deque的使用场景:
- 经常在序列头尾安插移除元素
- 希望元素被移除时释放内存用量
- 希望存储更多的元素(deque相较于vector采用一块内存,多块内存使用可以存更多元素)
list的使用场景:
- 经常在容器中执行插入、删除和移动
无序关联容器的使用场景:
- 经常根据某个准则查找元素,应该依据该准则进行hash
有序关联容器使用场景:
- 经常根据某个准则查找元素且要求依赖元素的次序