遍历 std::deque 并删除条目
looping through a std::deque and remove entries
我正在尝试遍历 std::deque 并删除其所有内容。我可以一路走来:
for(auto & x: myDeque)
{
// do something
myDeque.pop_front();
}
或者我可以在循环结束后做 myDeque.clear()
。我想知道我应该使用哪种方式?谢谢!
myDeque.clear()
会更容易,因为它会破坏其自身的所有节点。使用他们提供的功能,因为大多数时候,它可以非常有效地完成并减轻您的负担。
它的另一个优点是阅读您的代码的其他人可以更轻松地理解正在发生的事情。
几乎可以肯定的是,首先执行循环处理数据,然后单独执行 myDeque.clear();
清空它。
从纯理论的角度来看,无论哪种方式都是 O(n),但从实际的角度来看,clear
几乎总是至少一样快,而且通常更快。可能的例外情况是,如果您处理的双端队列太大以至于无法放入缓存。在这种情况下,立即对特定数据执行所有操作(包括删除)可以避免将该数据重新加载到缓存中两次:一次用于处理,另一次用于销毁它。
特别是,双端队列通常实现为两级结构:类似于 vector
指向块的指针,其中每个块包含固定数量的数据项。当你做pop_front
的时候,它要看第一个方块,判断这个pop_front是否清空了第一个方块。如果有,它会删除该块。如果不是,它只是更新一个索引来告诉它当前块中的哪个位置是前面的。
但是当你这样做时 clear
它可以遍历数据,并销毁所有内容。
我正在尝试遍历 std::deque 并删除其所有内容。我可以一路走来:
for(auto & x: myDeque)
{
// do something
myDeque.pop_front();
}
或者我可以在循环结束后做 myDeque.clear()
。我想知道我应该使用哪种方式?谢谢!
myDeque.clear()
会更容易,因为它会破坏其自身的所有节点。使用他们提供的功能,因为大多数时候,它可以非常有效地完成并减轻您的负担。
它的另一个优点是阅读您的代码的其他人可以更轻松地理解正在发生的事情。
几乎可以肯定的是,首先执行循环处理数据,然后单独执行 myDeque.clear();
清空它。
从纯理论的角度来看,无论哪种方式都是 O(n),但从实际的角度来看,clear
几乎总是至少一样快,而且通常更快。可能的例外情况是,如果您处理的双端队列太大以至于无法放入缓存。在这种情况下,立即对特定数据执行所有操作(包括删除)可以避免将该数据重新加载到缓存中两次:一次用于处理,另一次用于销毁它。
特别是,双端队列通常实现为两级结构:类似于 vector
指向块的指针,其中每个块包含固定数量的数据项。当你做pop_front
的时候,它要看第一个方块,判断这个pop_front是否清空了第一个方块。如果有,它会删除该块。如果不是,它只是更新一个索引来告诉它当前块中的哪个位置是前面的。
但是当你这样做时 clear
它可以遍历数据,并销毁所有内容。