文章目录
- 顺序容器
- 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,全名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
queue - FIFO
关联容器
有序关联容器
有序关联容器实现能快速查找( 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