STL 容器 与 数据结构
一.序列式容器(各元素之间是线性关系,vector, deque,list):迭代器类型,随机访问迭代器(list是双向访问迭代器,不支持随机访问)。
1.vector,向量
相当于动态数组,当程序员不知道需要的数组多大时,用其来解决问题来达到最大节约空间。
在不需要扩容的情况下,它的操作时间复杂度和数组一样。
vector占用的内存是只增不减的,它的erase和clear函数只删除元素,不回收空间,只在vector析构时回收空间。
也有insert函数,可在任意下标位置插入、删除(但不在尾部插入的话会导致指向vector的iterator、pointer,reference失效)。
2.deque,双向队列
逻辑结构:首尾都开放的动态数组
内部结构:多个连续的内存块,在一个映射结构中保存他们的地址和顺序
insert函数,可在任意下标位置插入、删除(但不在首尾部插入的话会导致指向vector的iterator、pointer,reference失效)。
不同于vector,当deque的内存不再被使用时,会自动释放。
3.list,双向链表
list每个节点都保存了信息块(元素值)、前驱指针、后驱指针,因此占用空间更大。
list由于是链表形式,在任意位置插入和删除效率都很高O(1),但对元素的访问复杂度O(n)。
二.关联式容器(元素按key值有序插入:set,multiset,map,multimap,都是由红黑树实现)
红黑树查找、插入、删除操作的时间复杂度是O(lgn)。采用插入方式生成一棵红黑树的时间复杂度是O(nlgn),而遍历红黑树的时间复杂度是O(n)。
迭代器类型:双向迭代器。
三.容器适配器(具有某种特殊功能的容器变种,不提供迭代器:stack、queue、priority_queue)
他们和容器的构造不同在于他们有一个参数class container,而容器有一个参数allocator
//vector template< class T, class Allocator = std::allocator<T> > class vector; //stack template< class T, class Container = std::deque<T> > class stack;
首先了解一下priority_queue的定义:
template< class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type> > class priority_queue;
priority_queue的一般性构造函数
template<InputIt> priority_queue(InputIn first,InputIn last, const Compare& compare, const Container& cont); //初始化例子 priority_queue<pair<string,int>,vector<pair<string,int>>,WordFreCompare > wordQue(wordMap.begin(),wordMap.end());
priority_queue默认比较符号 < ,它只保证队首top()是最大的元素,内部不一定有序。
四.unorder_map(hash表):内部是无序的,只与key相关(所以在使用自定义类型时,map要定义 < ,unorder_map要定义==)
还有4种散列(hash)关联容器(hash_set,hash_multiset,hash_map,hash_multimap):如果没有冲突,散列表的查找、存取时间复杂度是O(1),但一般冲突是不可避免的,所以时间复杂度不确定。
(hash表的桶一般是数组,计算出来的hash值一般是整数,可直接作为下标访问。)
unorder_map定义:
template< class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = std::allocator< std::pair<const Key, T> > > class unordered_map;