容器分为序列式容器和关联式容器,而关联式容器主体有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实现的,只是将之封装了一下。
关联式容器
最新推荐文章于 2024-03-24 22:37:32 发布