【问题标题】:How to limit the maximum size of vector?如何限制向量的最大大小?
【发布时间】:2019-12-19 10:25:26
【问题描述】:

我正在尝试使用像队列这样的有限大小缓冲区将一些数字放在后面,直到达到特定大小(例如 10),然后在将新元素添加到后面时从前面删除一个元素.

我为此使用了一个向量,但是在运行程序(在调试模式下)几次之后,我突然收到了堆损坏错误,例如:

检测到严重错误 c0000374

在运行中间,我认为应该与内存问题有关,因为当我减少向量数量时错误消失了。

到目前为止,我只是使用一个向量并每次都将新值放入它。例如,假设代码是这样的:

#include <iostream>
using namespace std;

vector<int> myvec;
int i = 0;

int main()
{
    while(True) {
        myvec.push_back(i);
        i++;
    }
    return 0;
}

如何将myvec 的大小限制为 10,这样当它包含 10 个元素并且正在添加一个新元素时,第一个元素会从内存中删除?

在这里使用向量是个好主意,还是我应该使用队列来代替?

【问题讨论】:

  • 是的,使用矢量是个好主意。只需将其包装在您的数据结构中,以便您管理大小。
  • 只需创建一个类并自定义推送方法
  • 没有办法直接限制向量的大小。
  • 您在评论中提到您需要在一端添加并从另一端删除的答案。这就是std::deque 的工作。至于限制元素的数量,只需在推新之前检查序列中有多少。用适当的接口编写你自己的类,并在类中使用std::deque 来保存它的数据。
  • 我最终使用了@PeteBecker 的建议。

标签: c++ memory vector queue buffer


【解决方案1】:

你可以这样做->

#include <iostream>
using namespace std;

vector<int> myvec;
int i = 0;

int main()
{
   while(True) {
    if(myvec.size()==10)
    {
        myvec.pop_back();
    }
    myvec.push_back(i);
    i++;
}
return 0;
}

【讨论】:

  • 是的,但我想从前面弹出并将元素保留在后面。我希望元素移动(全部同时移动),以便从内存中删除前面的一个元素,并将新元素添加到向量的后面。
  • 从前面删除:myvec.erase(0);
  • 是的,一旦达到 10 个元素并在添加另一个元素之前删除一个元素,向量就不需要分配更多内存。但是向量类可能会分配足够的空间来容纳超过 10 个,这样它就不必在每次添加元素时重新分配。阅读文档。
  • @JimRhodes — myvec.erase(0) 可以工作,但每次调用 erase 都必须将向量中的所有元素向下移动一个。这是慢的秘诀。
  • @HadiGhahremanNezhad 如果你想向前弹出并向后推,consider using a std::deque 代替 std::vectordeque 不是连续数据,会慢一点,但它旨在处理一侧推送并弹出另一侧用例。
猜你喜欢
  • 2018-06-24
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多