- 主题:弱问一下队列的小问题
在库函数里面,那些队列、优先队列等等,可以往里面加元素,queue.push(val),也可以弹出元素,queue.pop()。其中,往里面加元素时,队列的大小限制有默认大小吗?总不可能想加多少就加多少吧。
底层实现时,是怎么个处理法呢?先申请一块空间用着,当size满了之后,再重新申请一块更大的空间?还是每一次push进去新的元素时,都单独使用一个新的单元空间,内存是链表形式,不像数组那样连续的?
--
FROM 49.84.160.*
大小一般都是size_t的,x64上基本等于没限制,取决于可用内存
有bucket形式的存储,分散的,比如红黑树(红黑树实现的一般是容器,不是队列)。这种对cpu cache不友好。
也有连续形式的存储,对cpu cache更友好。
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
谢谢科普!
我就是在学到优先队列的时候,有点这个疑问的。
我看了一些优先队列的介绍文章,其本质是一个数组,各个下标映射成一棵虚拟的完整二叉树的父子节点,然后每次push()、pop()操作之后,要根据父子节点之间的优先级大小,将优先级高的元素推到堆顶。
此时我才产生了这个疑问,如果其本质是一个数组的话,那这一块数组的空间得是连续的,应该必须在事先分配好的,等满了之后,再重新realloc一块更大的空间。如果事先分配一个基本等于无限制的空间的话,那程序的其他部分岂不是没空间用啦?
【 在 z16166 的大作中提到: 】
: 大小一般都是size_t的,x64上基本等于没限制,取决于可用内存
: 有bucket形式的存储,分散的,比如红黑树(红黑树实现的一般是容器,不是队列)。这种对cpu cache不友好。
: 也有连续形式的存储,对cpu cache更友好。
: ...................
--
FROM 49.84.160.*
肯定不会预先分配一个无限制的空间啊,按需要realloc或者分段realloc吧,或者构造时就指定尺寸上限。
【 在 langman 的大作中提到: 】
: 谢谢科普!
: 我就是在学到优先队列的时候,有点这个疑问的。
: 我看了一些优先队列的介绍文章,其本质是一个数组,各个下标映射成一棵虚拟的完整二叉树的父子节点,然后每次push()、pop()操作之后,要根据父子节点之间的优先级大小,将优先级高的元素推到堆顶。
: ...................
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
看看deque的实现原理吧,相当于一个二维数组
【 在 langman 的大作中提到: 】
: 谢谢科普!
: 我就是在学到优先队列的时候,有点这个疑问的。
: 我看了一些优先队列的介绍文章,其本质是一个数组,各个下标映射成一棵虚拟的完整二叉树的父子节点,然后每次push()、pop()操作之后,要根据父子节点之间的优先级大小,将优先级高的元素推到堆顶。
: ...................
--
FROM 111.197.235.201
队列只是一个逻辑模型
底层有不同实现,不同的实现无非就是memory locality <----> flexibility之间的权衡
【 在 langman 的大作中提到: 】
: 谢谢科普!
: 我就是在学到优先队列的时候,有点这个疑问的。
: 我看了一些优先队列的介绍文章,其本质是一个数组,各个下标映射成一棵虚拟的完整二叉树的父子节点,然后每次push()、pop()操作之后,要根据父子节点之间的优先级大小,将优先级高的元素推到堆顶。
: ...................
--
FROM 122.234.150.*
c++有三种标准容器模型:deque,list和vector
而stl的队列/栈等数据结构的容器模型是deque。deque本质是动态内存分配,也就是他是分段的连续内存。容量不够,再分一段内存。
【 在 langman 的大作中提到: 】
: 谢谢科普!
: 我就是在学到优先队列的时候,有点这个疑问的。
: 我看了一些优先队列的介绍文章,其本质是一个数组,各个下标映射成一棵虚拟的完整二叉树的父子节点,然后每次push()、pop()操作之后,要根据父子节点之间的优先级大小,将优先级高的元素推到堆顶。
: ...................
--来自微微水木3.5.12
--
FROM 140.206.195.*
size满了之后,等待,消费者线程取后发信号。
消费者线程取空后等待,生产者装入数据后发信号。
【 在 langman 的大作中提到: 】
: 在库函数里面,那些队列、优先队列等等,可以往里面加元素,queue.push(val),也可以弹出元素,queue.pop()。其中,往里面加元素时,队列的大小限制有默认大小吗?总不可能想加多少就加多少吧。
: 底层实现时,是怎么个处理法呢?先申请一块空间用着,当size满了之后,再重新申请一块更大的空间?还是每一次push进去新的元素时,都单独使用一个新的单元空间,内存是链表形式,不像数组那样连续的?
--
FROM 221.221.48.*
生产者消费者模型。
【 在 langman 的大作中提到: 】
: 在库函数里面,那些队列、优先队列等等,可以往里面加元素,queue.push(val),也可以弹出元素,queue.pop()。其中,往里面加元素时,队列的大小限制有默认大小吗?总不可能想加多少就加多少吧。
: 底层实现时,是怎么个处理法呢?先申请一块空间用着,当size满了之后,再重新申请一块更大的空间?还是每一次push进去新的元素时,都单独使用一个新的单元空间,内存是链表形式,不像数组那样连续的?
--
FROM 221.221.48.*