c++ - 有没有比在基于数组的队列实现中向左移动元素更好的算法
问题描述
我正在尝试提出一种在 C++ 中实现类似于 Java 的阻塞数组队列的设计。我注意到,一旦我将数组的前部始终保持在索引 0 处,那么我必须将元素从索引 1 移到数组中的后部到左侧 [ 代价高昂的操作 ],以便队列可以再次插入后部。
有没有更好的实现呢?我看到有些人在 youtube 上有视频,其中的实现是在元素出列时不断移动队列的前指针。但是,一旦队列满载,当您从队列中出列时,您将如何让可用空间可用于插入?
如果您对问题仍有任何不清楚的地方,请指出。我试图确定是否有比将元素向左移动更好的方法,这似乎不可避免但效率低下。
解决方案
对于生产代码,最佳方式是使用 std::deque。
如果这是一个供您学习的练习,那么您可以实现一个环形缓冲区。正如您所描述的,您保留两个索引:一个指向队列的第一个元素,一个指向末尾的一个。每当您排队或出队时,您都会移动这些索引之一。缓冲区环绕末端。
当您进入队列并需要额外空间时,您需要重新分配更大的缓冲区。如果您通过将大小加倍来做到这一点,平均而言,您将产生固定成本(这称为摊销线性)。
推荐阅读
- fiware - 在 NGSI-LD 中引用 XSD
- laravel - Laravel 查询生成器对多列求和
- python - 我如何使用 discord.py 上 cogs 文件夹中的方法
- amazon-web-services - 如何在 Pulumi AWS Route 53 中使用域名?
- php - 启用 APM 代理 PHP 后崩溃 PHP 应用程序
- react-hooks - 对于仅在 Firefox 浏览器中从 react-material-ui-form-validator 使用的第一个错误 TextValidator 字段,页面锚定无法正常工作
- javascript - dispatch 不是一个函数 - Redux
- php - PHP/Laravel FormRequests 类型
- angular - 在 ControlValueAccessor 中提交 Angular 监听表单
- css - Tailwind 将圆圈放在按钮内