这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
更多STL容器
研究完vector之后,来看一下其他的STL容器。虽然这些容器是熟悉的数据结构,但其他语言中并未强调其底层的实现。
deque
deque即双向队列,关于deque的实现,比较多的说法是deque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。进一步求证,发现双向队列的实现是map+vector的结构,用一个个vector来储存元素,而用一个map来管理这些vector,因而随机访问时间复杂度是O(1)的,可看作list与vector的折中。
\\ 简单deque的声明与头尾添加元素
deque<int> deq;
deq.push_front(4);
deq.push_back(5);
list
STL中的list为双向链表,有着任意位置O(1)的插入效率,但访问起来慢,这是由于list结构内存是不连续的,每次插入会新申请内存,无论在任意位置插入,只要将元素前后指针的指向的位置指到新的那块内存就行了,下面是一个简单的把每个字母压入链表的例子。
list<char> listTemp;
for (char c = 'a'; c <= 'z'; ++c)
listTemp.push_back(c);
set与map
把set和map放一起是因为它们的实现是类似的。在别的一些语言和数据结构的文章中,
map这样的键值对是用hash算法来实现的,但是STL中的set和map是用红黑树(一种平衡二叉树)来实现的。红黑树比较复杂,在此不再赘述,但熟悉二叉树的人都知道,二叉树的时间复杂度是log(N),为什么不用hash呢?因为map这样的结构需要一些按key值遍历、范围查找、双向遍历等特性,而hash无法满足,纯hash结构键值对的实现在STL中为unordered_map