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;
原文地址:https://www.cnblogs.com/wukuaiqian/p/7768850.html