关联式容器

容器分为序列式容器和关联式容器,而关联式容器主体有set,map,hashtable为主,而mutiset,multimap,hash_set, hash_map,hash_multiset,hash_multimap都是其扩充。
set:其键值和实值都是同一个值,注意:set并没有什么机制,因为其底层是由RB-tree实现的,由于rb-tree的节点值不能有重复,所以set中的值在实现的时候就不允许被修改,(若被修改,红黑树rb-tree的顺序就会被严重破坏),由于不能出现重复值,所以在插入的时候,set底层调用的是红黑树中的insert_unique方法。操作之前的所有迭代器,在操作完成之后都依然有效。因为红黑树的结构和一般二叉树的结构是一样的,只是多了颜色值。见博客红黑树
map:是一个键值对,底层同样是rb-tree实现的,所以其键值不能被修改,但其实值可以被修改,键值即为树中的节点,同样,在进行插入操作的时候,调用红黑树中的insert_unique方法。
hashtable:其实现原理的底层就是散列表(hash表),利用散列表中装链表list的数组作STL源码中的桶,用vector实现,数组有多少个元素,桶就由多少个。不过桶中的链表是使用单链表进行链接元素的,所以它不能向前迭代,即不允许遍历。插入和删除操作也是使用散列表中的插入删除操作,具体实现见散列表博客。
注意:rb-tree由于是完成自动排序,也就是说set,map的底层都是红黑树,set,map只是将rb-tree的函数封装了一下而已,在创建时顺序就已经排好,但hashtable利用的散列表进行插入,它并不支持排序功能。
multiset,multimap与set,map唯一不同的就是允许有相同的值,即插入操作使用rb-tree中的equal方法。而hash_set,hash_map的底层是hashtable,所以元素没有自动排序功能,hash_mutiset,hash_multimap与hash_set,hash_map的唯一区别就是插入的时候使用的是insert_equal,而不是insert_unique方法,底层都是hashtable实现的,只是将之封装了一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值