我想知道C ++中以下问题最合适的数据结构是什么
我想存放新近订购的100个花车。因此,当我添加(推送)新项目时,其他元素会向上移动一个位置。每次触发事件时,我都会收到一个值,然后将其添加到我的数据结构中。
当元素数量达到100时,我想删除(弹出)末尾的项目(最旧的)。
我希望能够迭代所有元素并对它们执行一些数学运算。
我查看了所有标准C ++容器,但没有一个能满足我的所有需求。使用标准C ++代码实现这一目标的最简单方法是什么?
答案 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
以外的东西,你需要改变它。虽然这会增加一些比你需要的功能更多的功能,但它非常高效,因为它是一个双向链表。
答案 3 :(得分:0)
你可以使用std :: array,std :: dequeue,std :: list或std :: priority_queue
答案 4 :(得分:-1)
MAP(std :: map)应该能够解决您的需求。使用Key作为对象和值作为当前推送数nPusheCount,每当您向地图添加元素时,该数字都会递增。 在向地图添加新元素时,如果您的元素少于100个,只需将数字作为键添加到MAP,将nPushCount作为值添加。 如果您已经有100个元素,请检查该数字是否已存在于地图中并执行以下操作: