码迷,mamicode.com
首页 > 编程语言 > 详细

C++ STL 容器重要概念

时间:2020-09-17 23:27:20      阅读:41      评论:0      收藏:0      [点我收藏+]

标签:基本   hash   方式   容器   自定义   长度   gnu   table   ring   

本文所有内容均在 GNU C++ (64位) 里瞎搞出来,有很多猜测,仅供参考

如何定义

vector/deque/list/forward_list <T, allocator<T> >
set <T, less<T>, allocator<T> >
map <T, U, less<T>, allocator< pair<T, U> > >
unordered_set < T, hash<T>, equal_to<T>, allocator<T> >
unordered_map < T, U, hash<T>, equal_to<T>, allocator< pair<T, U> > >
basic_string/basic_stringstream <T, char_traits<T>, allocator<T> >
queue/stack <T, deque<T> >
priority_queue <T, vector<T>, less<T> >
array <T, N>
bitset <N>

内存分配

容器 sizeof 扩容方式 内存释放方式
vector 24 每次两倍 不释放
deque 80 初始512字节,每次512字节+少量额外内存 基本释放
list 16 要多少申请多少 不留多余内存
forward_list 8 要多少申请多少 不留多余内存
(multi)set/map 48 要多少申请多少 不留多余内存
unordered_(multi)set/map 56 要多少申请多少+桶的内存 桶不释放,其余不留多余内存
string 8 每次两倍+少量额外内存 不释放
stringstream 368 初始512字节,每次两倍+少量额外内存 不释放
  • queue,stack,priority_queue是由其他容器改造过来的(第二个模板参数),queue,stack默认是deque,priority_queue默认是vector
  • array,bitset都是固定长度,没有内存分配器,估计和数组行为一致
  • list,forward_list,set,map这些链表数据结构(unordered每个桶也是链表),每个结点的指针的内存不通过自定义内存分配器分配。目前初步估计set/map的每个结点有额外24字节(通过鸡兔同笼法),其余懒得算

时间复杂度

  • listsize()\(O(n)\) 的!(forward_list 干脆不定义这个函数),想用 list 代替 deque 的同学要注意这个坑点
  • 其他复杂度还没发现不正常的

迭代器

  • 由其他容器改造的容器(queue,stack,priority_queue)都没有迭代器
  • bitset没有迭代器
  • stringstream没有迭代器(不考虑特殊迭代器)

C++ STL 容器重要概念

标签:基本   hash   方式   容器   自定义   长度   gnu   table   ring   

原文地址:https://www.cnblogs.com/axiomofchoice/p/13659385.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!