c++,最快的STL容器,用于递归地执行{delete[begin], insert[end]和对整个数组内容求和}

C++, fastest STL container for recursively doing { delete[begin], insert[end], and summing entire array contents}

本文关键字:end insert 数组 求和 begin 用于 容器 STL 递归 c++ delete      更新时间:2023-10-16

我有一些代码和一个数组,每次迭代我删除第一个元素,在末尾添加一个元素,然后对数组的内容求和。自然,数组的大小保持不变。我试过使用向量和列表,但两者似乎都很慢。

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的大小,每次迭代所花费的时间。使用链表避免了这种情况(常量时间删除元素),并且不应该牺牲任何求和数组的时间(数组的线性时间遍历),除了在我的程序中,它似乎比向量花费更长的时间来求和内容(至少长一个数量级)。

是否有更好的容器在这里使用?还是另一种解决问题的方法?

为什么不和sum -= l_int.front(); sum += z保存一个流水账呢?

对于删除/插入性能,你需要的数据结构是queue

创建deque就是为了在容器中高效地添加和删除结束元素。

如果你只是在一端插入,在另一端删除,那么你可以使用队列

相关文章: