文章目录

  • 顺序容器
  • deque的底层实现
  • 容器适配器
  • stack - FILO
  • queue - FIFO
  • 关联容器
  • 有序关联容器
  • 无序关联容器
  • 参考


顺序容器

数据结构

特点

常用方法

底层实现

array

定长,支持随机访问,不支持插入、增删元素、清空

template<class T,std::size_t N> struct array;at;[]

数组

vector

不定长,自动扩容,支持随机访问,删除指定元素,尾部扩展O1和插入操作

insert,push_back,at,[],erase,clear

动态数组

list

不支持随机访问,支持插入删除,支持排序,有序链表合并

push_back,pop_back,push_front,pop_front,sort

双向链表

forward_list

首部扩展和访问,支持排序,有序链表合并

pop_front,push_front,insert_after,merge,remove,sort

单向链表

deque

双端队列,支持首尾扩展删除,支持随机访问,支持insert和erase,不支持排序

push_back,pop_back,push_front,pop_front

deque实现原理

deque的底层实现

双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的抽象数据类型。双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行。

两个容器可以挂载一个路径吗_两个容器可以挂载一个路径吗

容器适配器

容器适配器提供顺序容器的不同接口。

数据结构

特点

常用方法

底层实现

stack

FILO,仅支持对栈顶的插入、删除、访问操作

top,pop,push

基于deque的FILO适配器

queue

FIFO,尾部扩展,首部删除,不支持insert和erase操作

push,pop,front,back

基于deque的FIFO适配器

priority_queue

优先队列,最大堆和最小堆,删除队首

push,pop,top

基于vector的堆数据结构的适配器

stack - FILO

两个容器可以挂载一个路径吗_数据结构_02

queue - FIFO

两个容器可以挂载一个路径吗_STL_03

关联容器

有序关联容器

有序关联容器实现能快速查找( O(log n) 复杂度)的数据结构

数据结构

特点

常用方法

底层实现

map

有序键值对容器,key唯一,通过key访问,支持插入、删除和排序

at,[],erase,insert,find,equal_range

红黑树

multimap

允许键重复,不支持at、[]访问方式

count,find,contains,insert,erase,equal_range

红黑树

set

唯一键的集合,按照键排序

erase,insert,find,count,equal_range

红黑树

multiset

键允许重复,按照键排序

erase,insert,find,count,equal_range

红黑树

无序关联容器

无序关联容器提供能快速查找(均摊 O(1) ,最坏情况 O(n) 的复杂度)的无序(哈希)数据结构。

数据结构

特点

常用方法

底层实现

unordered_set

唯一键的集合,按照键生成散列

inser,erase,find,equal_range

哈希表

unordered_map

键值对的集合,按照键生成散列,键是唯一的,支持at、[]访问方式

at,[],find,insert,erase,equal_range

哈希表

unordered_multiset

键的集合,按照键生成散列,key允许重复

insert,erase,count,find,equal_range

哈希表

unordered_multimap

键值对的集合,按照键生成散列,key允许重复,不支持at、[]访问方式

insert,erase,find,count,equal_range

哈希表

支持随机访问([] 和 at)的容器有:array、vector、deque、map、unordered_map。

  • 其中针对array、vector、deque:
  • []: 不会进行下标越界检查,导致越界行为未定义,原因是为了效率,强制下标越界检查会增加程序的性能开销。
  • at: 则会进行越界检查,无效索引时会抛出out_of_range异常。
  • map、unordered_map:
  • []: 若这种键不存在则进行插入。
  • at: 访问指定的元素,同时进行越界检查。若容器无拥有指定 key 的元素则会抛出异常。
#include <iostream>
#include <unordered_map>

using namespace std;

int main()
{
    std::unordered_map<int *, int *> test;
    int a = 1;
    try
    {
        if (test.at(&a) == nullptr)
        {
            cout << "a is true" << endl;
        }
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }

    if (test[nullptr] == nullptr)
    {
        cout << "is true" << endl;
    }
    else
    {
        cout << "is false" << endl;
    }
    cout << "test size " << test.size() << endl;
    return 0;
}

output:

invalid unordered_map<K, T> key
is true
test size 1

参考

cppreference