-
无序容器 #include<unordered_set> #include<unordered_map>
以hash table为基础的容器。不需要排序准则。
Key和value必须是copyable或movable。Key必须是comparable。
第二或第三个参数用来定义hash function,默认hash<>,定义于<function>第三或第四参数定义等价准则,用来查找元素,默认equel_to<>。
特性:一个hash code将被关联至一个linked list,至少是forward list。
关于rehashing:传统是在单一insert和erase时会发生内部数据重新组织。递进式做法是渐进改变bucket或slot的数量时发生。
在拥有良好的hashing策略时,安插、删除、查找元素时是摊提常量时间。
存在缺点:不提供<,>,<=>,>=,只提供==和!=。不提供lower_bound()和upper_bound()。由于iterator至少保证forwardlist,不能用反向iterator。
不可以直接改动元素的(key)value。和associative一样做。
以下接口反应其行为:不提供直接元素访问操作;从iterator角度,元素的(key)value是常量。
Rehashing发生在:insert()、rehash()、reserve()、clear()调用后。Erase()不会造成指向的iterator、reference、pointer失效。
-
创建、复制和销毁
关于template的参数,见上。对于unord c(bnum)提供至少bnum个bucket。欲指定最大负载系数必须在构建后立刻调用一个成员函数c.max_load_factor(0.7);参数必须是个float,通常是0.7~0.8,默认1.0。
-
布局操作
一些用来查询及影响内部布局的操作函数。
c.reserve();比c.rehash();更好,直接传递应筹备的元素个数。
-
提供自己的hash<>
提供一个良好的hash函数非常困难。
-
非更易操作
只提供==和!=
-
特殊查找操作
应用容器提供的特殊查找函数,拥有常量时间复杂度,寻常算法是线性复杂度,前提是hash value均匀分布。有:c.count(val);c.find(val);c.equel_range(val)
-
Assignment
必须具有相同的类型,hash function和equivalence criterion(等价准则)必须相同。
Hash函数不同,也可以被赋值和交换。
-
迭代器相关函数和元素的访问
不可以使用元素直接访问,必须使用range-basedfor循环或iterator访问。
不可以为元素进行任意更易型算法。
容器迭代器操作见书P369页。
-
安插和移除元素
Erase()不会造成指向的iterator、reference、pointer失效。但是insert()和enplace()可能另所有iterator失效。Rehashing发生时,reference总是保持有效。
对于一个Unordered set,安插可能失败。
最方便的安插方法是初值列安插。当然还有其他三种方式:1.用value_type2.用pair<>3.用make_pair()
-
Bucket接口
可以通过的定的bucket接口访问个别的bucket
-
使用unorderedmap作为associative array
C[key]=value;安插一个带key的元素,若存在返回指向key的reference。
别对cout用,该方法安插慢,最方便的是初值列。
c.at(key) 返回指向key的reference。
-