用于存储最新值的C ++固定大小容器

时间:2015-01-19 13:51:58

标签: c++ stack queue containers

我想知道C ++中以下问题最合适的数据结构是什么

我想存放新近订购的100个花车。因此,当我添加(推送)新项目时,其他元素会向上移动一个位置。每次触发事件时,我都会收到一个值,然后将其添加到我的数据结构中。

当元素数量达到100时,我想删除(弹出)末尾的项目(最旧的)。

我希望能够迭代所有元素并对它们执行一些数学运算。

我查看了所有标准C ++容器,但没有一个能满足我的所有需求。使用标准C ++代码实现这一目标的最简单方法是什么?

5 个答案:

答案 0 :(得分:3)

无需创建自己的库或使用库,std::vector是最有效的标准数据结构。一旦达到最大大小,将不再有动态内存分配。与动态内存分配的成本相比,向上移动100个浮点数的成本微不足道。 (这就是为什么std::list是一个缓慢的数据结构)。向量没有push_front函数。相反,您必须使用v.insert(v.begin(), f)

当然,这假设你所做的是性能关键,它可能不是。在这种情况下,我会使用std::deque来更方便地使用。

答案 1 :(得分:2)

你想要一个循环缓冲区。您可以使用Boost's implementation或通过分配数组并跟踪已使用范围的开头和结尾来创建自己的数组。这可以归结为索引模100。

答案 2 :(得分:0)

刚看到你需要对它们进行迭代。使用list

你的基本功能看起来像这样

void addToList(int value){
    list100.push_back(value);
    if(list100.size() > 100){
        list100.pop_front();
    }
}

迭代它们也很容易:

for(int val : list100){
    sum += val;
}
// Average, or whatever you need to do

显然,如果你使用int以外的东西,你需要改变它。虽然这会增加一些比你需要的功能更多的功能,但它非常高效,因为它是一个双向链表。

http://www.cplusplus.com/reference/list/list/

答案 3 :(得分:0)

你可以使用std :: array,std :: dequeue,std :: list或std :: priority_queue

答案 4 :(得分:-1)

MAP(std :: map)应该能够解决您的需求。使用Key作为对象和值作为当前推送数nPusheCount,每当您向地图添加元素时,该数字都会递增。 在向地图添加新元素时,如果您的元素少于100个,只需将数字作为键添加到MAP,将nPushCount作为值添加。 如果您已经有100个元素,请检查该数字是否已存在于地图中并执行以下操作:

  1. 如果地图中已存在该数字,则将该数字添加为键,将nPushCount添加为值;
  2. 如果不是,请删除nPushCount值最低的数字,然后使用更新的nPushCount添加所需的数字。