容器总结——无序容器


  1. 无序容器    #include<unordered_set>   #include<unordered_map>

hash table为基础的容器。不需要排序准则。

Keyvalue必须是copyablemovableKey必须是comparable

第二或第三个参数用来定义hash function,默认hash<>,定义于<function>第三或第四参数定义等价准则,用来查找元素,默认equel_to<>

 

特性:一个hash code将被关联至一个linked list,至少是forward list

关于rehashing:传统是在单一inserterase时会发生内部数据重新组织。递进式做法是渐进改变bucketslot的数量时发生。

在拥有良好的hashing策略时,安插、删除、查找元素时是摊提常量时间

存在缺点:不提供<,>,<=>,>=,只提供==!=。不提供lower_bound()upper_bound()。由于iterator至少保证forwardlist,不能用反向iterator

不可以直接改动元素的(keyvalue。和associative一样做。

以下接口反应其行为:不提供直接元素访问操作;从iterator角度,元素的(keyvalue是常量。

Rehashing发生在:insert()rehash()reserve()clear()调用后。Erase()不会造成指向的iteratorreferencepointer失效。

    1. 创建、复制和销毁

      关于template的参数,见上。对于unord c(bnum)提供至少bnumbucket。欲指定最大负载系数必须在构建后立刻调用一个成员函数c.max_load_factor(0.7);参数必须是个float,通常是0.7~0.8,默认1.0

    2. 布局操作

      一些用来查询及影响内部布局的操作函数。

      c.reserve();c.rehash();更好,直接传递应筹备的元素个数。

    3. 提供自己的hash<>

      提供一个良好的hash函数非常困难。

    4. 非更易操作

      只提供==!=

    5. 特殊查找操作

      应用容器提供的特殊查找函数,拥有常量时间复杂度,寻常算法是线性复杂度,前提是hash value均匀分布。有:c.count(val);c.find(val);c.equel_range(val)

    6. Assignment

      必须具有相同的类型,hash functionequivalence criterion(等价准则)必须相同。

      Hash函数不同,也可以被赋值和交换。

    7. 迭代器相关函数和元素的访问

      不可以使用元素直接访问,必须使用range-basedfor循环或iterator访问。

      不可以为元素进行任意更易型算法

      容器迭代器操作见书P369页。

    8. 安插和移除元素

      Erase()不会造成指向的iteratorreferencepointer失效。但是insert()enplace()可能另所有iterator失效。Rehashing发生时,reference总是保持有效。

      对于一个Unordered set,安插可能失败。

      最方便的安插方法是初值列安插。当然还有其他三种方式:1.value_type2.pair<>3.make_pair()

    9. Bucket接口

      可以通过的定的bucket接口访问个别的bucket

    10. 使用unorderedmap作为associative array

      C[key]=value;安插一个带key的元素,若存在返回指向keyreference

      别对cout用,该方法安插慢,最方便的是初值列。

      c.at(key) 返回指向keyreference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值