【问题标题】:Maintaining a vector of a maximum size?保持最大尺寸的向量?
【发布时间】:2016-11-22 01:04:22
【问题描述】:

这适用于将我的向量长度保持在我选择的max_size 之下,并且我无法通过我的测试使其中断,但是限制向量大小的方法安全吗?

  if (vector.size() >= max_size) {
    vector.erase(vector.begin());
  }

它用于撤销/重做状态,所以我只想在内存中保留有限数量的状态。

【问题讨论】:

  • 只要你只有一个线程,一次添加多个项目是不可能的,而且你在迭代时不要这样做,是的。题外话:考虑使用std::deque instead. 这个用途应该有更好的性能,但不会是连续内存。
  • boost::circular_buffer。正如一个答案已经指出的那样,您所描述的是一个 ringcircular buffer,即使您不知道它也是如此。
  • 好的,谢谢,我会研究这些选项。这是一个相当小的集合,有 50 个 8 字节类型,并且以用户点击输入的最大速度访问,但如果可以的话,优化可能是一个好习惯。

标签: c++ vector data-structures


【解决方案1】:

这种方法可行(假设您一次添加一个元素),但速度不会很快。 std::vector 类型针对末尾而不是开头的插入和删除进行了优化,如果std::vector 中有大量元素,则删除第一个元素的成本可能会很高。如果您要保留较大的缓冲区,最好使用std::deque,它针对前端和后端的删除进行了优化(正是您的用例。)

对于它的价值,您可能想查找术语“循环缓冲区”,这是您在逻辑上谈论的那种数据结构。

【讨论】:

    【解决方案2】:

    如果在调用您的方法之前std::vector 增加了多个元素,则此方法将不起作用,因为如果std::vector 大于max_size,您的方法只会删除一个元素。

    以下代码将根据std::vector 中有多少额外元素删除一系列元素。

    if (vector.size() >= max_size)
    {
        auto elements_to_erase = (vector.size() - max_size) + 1;
        vector.erase(vector.begin(), vector.begin() + elements_to_erase);
    }
    

    【讨论】:

    • 这是添加到矢量的唯一方法的第一部分,所以我认为我不会遇到这个问题,但我会考虑到将来使用矢量的方法。跨度>
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多