数据结构::关于STL中map,set,muliset,multimap要说的

来源:互联网 发布:空姐老了知乎 编辑:程序博客网 时间:2024/06/05 20:13

前言

1、对于关联式容器,在插入和删除的时候是不需要内存拷贝可内存移动的,所有的元素
都是用节点的方式进行存取,所以在这里插入和删除都是指针的移动,而不会发生内存
移动,因此在进行插入操作的时候是不会发生迭代器失效的问题的。


相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator。


2、map<int, int, less<int>, Alloc<int> > intmap;

这时候在intmap中使用的allocator并不是Alloc<int>, 而是通过了转换的Alloc,具体转换的方法时在内部通过Alloc<int>::rebind重新定义了新的节点分配器,详细的实现参看彻底学习STL中的Allocator。其实你就记住一点,在map和set内面的分配器已经发生了变化,reserve方法你就不要奢望了。

3、STL中以空间配置器来分配这些内存,以内存池来进行管理这些内存,大大减少了内存碎片,提高了系统的性能。



底层详述:

1、set的底层实现:

1)迭代器是被定义成const iterator的,说明set的键值是不允许更改的
2)set使用的是insert_unique,而不是insert_equal,因为set是不允许相同的键值存在的
3)使用STL算法find进行查找可以,但是不是很好的办法,可以直接用STL的find来进行搜寻,效率会更好,因为是循序搜寻
4)不允许通过迭代器进行修改set里面的值


2、map的底层实现
1)所有元素都是pair,pair有连个成员:first和second;
2)我们不可以通过map的迭代器来进行元素的修改,因为map的键值关系到它的排列规则,如果
修改的话,就将这种规则破坏了。但是我们可以修改实值的值,因为实值与其排列无关
eg:it->second = 5;可以进行修改value的值
3)也是通过红黑树进行实现的
4)map的迭代器不是const 类型的,因为它允许进行修改键值
5)它的底层也是insert_unique,
6)关于重载的下标的使用:使用其键值查找它的实值
   返回第一个键值对应的实值的引用


3、nultiset,multimap
1)允许键值重复
2)采用的是红黑树的insert_equal机制














0 0