c++,最快的STL容器,用于递归地执行{delete[begin], insert[end]和对整个数组内容求和}
C++, fastest STL container for recursively doing { delete[begin], insert[end], and summing entire array contents}
我有一些代码和一个数组,每次迭代我删除第一个元素,在末尾添加一个元素,然后对数组的内容求和。自然,数组的大小保持不变。我试过使用向量和列表,但两者似乎都很慢。
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就是为了在容器中高效地添加和删除结束元素。
如果你只是在一端插入,在另一端删除,那么你可以使用队列
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- Insert函数不适用于2 if语句C++
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 了解向量中的 .begin 和 .end
- 如何实现链表的 end()?
- 使用 map.end() 访问 map 的最后一个元素
- C++ const char with .begin() and .end()
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- std::push_back和insert(end(),x)之间的矢量不一致崩溃
- c++,最快的STL容器,用于递归地执行{delete[begin], insert[end]和对整个数组内容求和}