大家好,深入解析 STL:数据结构及其内部实现机制相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于深入解析 STL:数据结构及其内部实现机制和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
容器(Container) —— 各种基本数据结构适配器(Adapter) —— 可以改变容器、迭代器或函数对象接口的组件算法(Algorithm) —— 各种基本算法,如排序、搜索.等迭代器(Iterator) —— 连接容器和算法函数对象(function object) 分配器(allocator) 主要总结了前两类:容器和容器适配器~
一、Container(容器)
顺序容器
1. vector内部数据结构:连续存储,如数组。随机访问每个元素需要O(1) 时间。在末尾添加或删除元素需要O(1) 时间,在中间或开头添加或删除元素需要O(n) 时间。元素可以动态添加或减少,内存管理是自动完成的,但程序员可以使用reserve()成员函数来管理内存。当内存被重新分配时,向量的迭代器变得无效(它指向的元素在操作前后不再相同)。当向量中插入超过capacity() - size()个元素时,内存将被重新分配,所有迭代器将失效;否则,指向当前插入元素之后的任何元素的迭代器都将无效。
建议:使用 vector 时,用 reserve() 成员函数预先分配需要的内存空间,它既可以保护迭代器使之不会失效,又可以提高运行效率。2. deque内部数据结构:连续存储或分段连续存储,取决于实现(分段连续存储更常见)。随机访问每个元素需要O(1) 时间。首尾添加元素所需时间为O(1),中间添加或删除元素所需时间为O(n)(连续存储时)或O(1)(连续分片存储时) )。可以动态增加或减少元素,内存管理自动完成,不提供内存管理的成员函数。添加任何元素都会使双端队列的迭代器无效。删除双端队列中间的元素将使迭代器失效。当从双端队列的头部或尾部删除元素时,只有指向该元素的迭代器变得无效。3. list内部数据结构:双向环状链表。不能随机访问元素。可以双向移动。在开头、结尾以及中间任意位置添加或删除元素需要O(1) 时间。可以动态添加或减少元素,内存管理自动完成。添加任何元素不会使迭代器失效。当一个元素被删除时,除了指向当前被删除元素的迭代器之外,其他迭代器都不会失效。4. slist内部数据结构:单向链表。它不能双向移动,只能从前向后移动。其他属性与列表相同。
建议:尽量不要使用 slist 的 insert、erase、previous 等操作。因为这些操作需要向前遍历,但是 slist 不能直接向前遍历,所以它会从头开始向后搜索,所需时间与位于当前元素之前的元素个数成正比。虽然 slist 专门提供了 insert_after、earse_after 等函数进行优化。但若经常需要向前遍历,建议选用 list。
关联容器
1. set内部数据结构:红黑树。键和值是相等的。 key是唯一的(如果插入的key已经存在,则插入不会成功,但不会报错)。默认情况下,元素按升序排序。如果迭代器指向的元素被删除,则迭代器失效。添加或删除元素的任何其他操作不会使迭代器失效。2. multiset内部数据结构:红黑树(一般红黑树等搜索二叉树不允许有重复的key,但是在这里插入相同的key时,该key会放在相等key的右侧。无论后面怎么进行插入或者删除操作,后面添加的key总是被认为比前面的大,这样就实现了一个multiset,但是根据key进行查找的时候,我们要自己做相同key的处理) 。按键可以重复。其他功能与设定相同。3. hash_set内部数据结构:哈希表(数组 + 链表)。与set相比,其中的元素不一定是排序的,而是根据使用的哈希函数进行调度,可以提供更快的搜索速度(当然与哈希函数有关)。其他功能与设定相同。4. hash_multiset内部数据结构:哈希表(数组 + 链表)。键可能不是唯一的。其他功能与hash_set相同。5. map内部数据结构:红黑树。关键是独一无二的。元素按其默认键升序排序。如果迭代器指向的元素被删除,则迭代器失效。添加或删除元素的任何其他操作不会使迭代器失效。6. multimap内部数据结构:红黑树。键可能不是唯一的。其他功能与地图相同。7. hash_map内部数据结构:哈希表(数组 + 链表)。与map相比,其中的元素不一定按照key值排序,而是根据使用的hash函数进行调度,可以提供更快的搜索速度(当然也和hash函数有关)。其他功能与地图相同。8. hash_multimap内部数据结构:哈希表(数组 + 链表)。键可能不是唯一的。其他功能与hash_map相同。建议:
1)当元素的顺序比搜索速度更重要时,应使用set、multiset、map或multimap。否则,使用hash_set、hash_multiset、hash_map 或hash_multimap。
2)如果经常需要在序列容器的开头或中间添加或删除元素,则应该使用list。
3)当容器作为参数传递时,请使用引用传递。否则就会调用容器的复制构造函数,开销是难以想象的。
二、Adapter(适配器)
C++中定义了三种类型的容器适配器,它们将容器提供的接口转变为三种常用的数据结构:堆栈、队列和优先级队列。
1. stack可以将任意类型的序列容器转换为栈,一般使用deque或者list作为支持的序列容器。元素只能是后进先出。不支持遍历操作。2. queue
好了,关于深入解析 STL:数据结构及其内部实现机制和的问题到这里结束啦,希望可以解决您的问题哈!
【深入解析 STL:数据结构及其内部实现机制】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
STL真神!我一直想学习一下它的实现原理,现在正好有机会了.
有15位网友表示赞同!
看了这个标题,突然觉得自己对C++基础掌握太浅了,需要赶紧补习一下。
有13位网友表示赞同!
数据结构和算法是程序员的必修课,了解STL是如何实现的确实很重要呀!
有14位网友表示赞同!
感觉标题很专业,但又想读入深度内容,期待文章能解释得通俗易懂。
有7位网友表示赞同!
以前就听说STL里面有许多常用的数据结构,这次终于有机会来详细了解一下。
有18位网友表示赞同!
我想学习如何优化STL的使用效率,这个标题是不是可以指明方向?
有14位网友表示赞同!
对容器、迭代器这么常见的东西还是不太理解,希望能通过这篇文章加深理解。
有7位网友表示赞同!
以前都是直接调用的STL函数,很少去了解它背后的实现机制,真让人眼 aç!
有18位网友表示赞同!
C++真是太牛了,拥有一个如此方便强大的库系统。
有12位网友表示赞同!
学习STL的实现原理可以帮助我们更好地理解代码运行机制吧?
有15位网友表示赞同!
希望文章能详细讲解每个数据结构的特点和适用场景,这样更容易记住.
有6位网友表示赞同!
STL确实是一个非常实用的工具,想要成为一名优秀的C++程序员,必须得了解它的内涵。
有11位网友表示赞同!
看到这个标题,我决定把学习STL 作为今后的目标了!
有11位网友表示赞同!
学习数据结构和算法的难度一直让我困扰,希望这篇文章能给我一些启发。
有10位网友表示赞同!
以前觉得STL很复杂,现在看来其实它是有规律可循的,可以好好地去学习下.
有20位网友表示赞同!
学习STL的实现原理,还能让我们更好地进行代码调试和优化!
有12位网友表示赞同!
希望的文章能用图解或者例子来讲解,这样更容易理解。
有14位网友表示赞同!
学习STL的知识点真多,需要慢慢整理消化才行。
有18位网友表示赞同!
期待作者能分享一些实用的案例,让我们更好地体会STL的美妙之处!
有9位网友表示赞同!