C++,最快的 STL 容器,用于递归执行 { 删除 [开始]、插入 [结束] 和对整个数组内容求和}

标签 c++ performance containers

我有一些代码和一个数组,每次迭代我都会删除第一个元素,在末尾添加一个元素,然后对数组的内容求和。自然地,数组保持相同的大小。我试过同时使用 vector 和列表,但两者看起来都很慢。

int length = 400;

vector <int> v_int(length, z);
list <int>   l_int(length, z);

for(int q=0; q < x; q++)
{
    int sum =0;

    if(y)                       //if using vector
    {      
        v_int.erase(v_int.begin());    //takes `length` amount of time to shift memory
        v_int.push_back(z);   
        for(int w=0; w < v_int.size(); w++)
            sum += v_int[w];
    }      
    else                        //if using list
    {
        l_int.pop_front();             //constant time
        l_int.push_back(z);
        list<int>::iterator it;
        for ( it=l_int.begin() ; it != l_int.end(); it++ ) //seems to take much  
            sum += *it;                                    //longer than vector does
    }
}

问题是删除 vector 的第一个元素需要将每个其他元素向下移动,乘以 vector 的大小,每次迭代所花费的时间。使用链表可以避免这种情况(恒定时间删除元素),并且不应牺牲任何时间对数组求和(数组的线性时间遍历),除了在我的程序中它似乎比对内容求和花费更长的时间vector 确实如此(至少长 1 个数量级)。

这里有更好的容器可以使用吗?还是解决问题的不同方法?

最佳答案

为什么不用 sum -= l_int.front(); 来保持运行总和?总和 += z?

此外,您正在寻找具有删除/插入性能的数据结构是一个队列

关于C++,最快的 STL 容器,用于递归执行 { 删除 [开始]、插入 [结束] 和对整个数组内容求和},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7061885/

相关文章:

c++ - Qt 滚动条不会出现在自定义小部件上

x86-64 程序集的性能优化 - 对齐和分支预测

JavaScript - 将原型(prototype)添加到特定对象

html - 如何在盒子/容器中水平和垂直居中对齐文本?

flutter - 如何在 flutter 中将一个容器夹在另一个容器上?

c++ - boost spirit header 已弃用

C++ 映射键/迭代器操作

c++ - 在SDL_ttf中使用UTF8渲染字体

javascript - JQuery grep(...) VS 原生 JavaScript filter(...) 函数性能

python - Docker 容器是否共享一个 Python GIL?