我正在尝试遍历std::deque并删除它的所有内容。我可以一路上这样做:
for(auto & x: myDeque)
{
// do something
myDeque.pop_front();
}
或者我可以在循环结束后执行myDeque.clear()
。我想知道我应该用哪种方式?谢谢!
发布于 2021-01-29 04:46:44
几乎可以肯定的是,首先执行循环来处理数据,然后单独执行myDeque.clear();
来清空它。
从纯理论的角度来看,无论哪种方式都是O(n),但从实际的角度来看,clear
几乎总是至少一样快,而且通常更快。可能的例外是,如果您正在处理的deque太大,以至于无法放入缓存中。在这种情况下,一次对特定数据段执行所需的所有操作(包括删除)可以避免将该数据重新加载到缓存中两次:一次用于处理,另一次用于销毁。
特别是,deque通常实现为两级结构:非常类似于指向块的指针的vector
,其中每个块包含固定数量的数据项。当您执行pop_front
时,它必须查看第一个块,确定此pop_front是否清空了第一个块。如果有,它会删除该块。如果不是,它只会更新一个索引,告诉它当前块中的哪个位置是前面。
但当你使用clear
时,它只会遍历数据,并销毁所有内容。
发布于 2021-01-29 04:45:46
myDeque.clear()
将更容易,因为它将销毁自身上的所有节点。使用他们提供的功能,因为在大多数情况下,它可以更有效地完成任务,并减轻您的负担。
它的另一个好处是,其他阅读您的代码的人将更容易理解正在发生的事情。
https://stackoverflow.com/questions/65944941
复制相似问题