我的代码中最常见的错误之一是 STL 容器在循环期间被修改。
在循环执行期间删除或添加元素,因此我通常会遇到超出范围的异常。
我的 for 循环通常如下所示:
for (auto& Item : Items) { // Will not work when Items container is modified
//... loop logic
}
当可以删除多个项目时,我使用这个怪物:
for (int Index=Items.size()-1;Index<=0;Index--) {
if (Index<Items.size()) { //Because multiple items can be removed in a single loop
//... loop logic
}
}
这看起来很糟糕,使用第二个选项让我感觉很糟糕。可以删除多个项目的原因是由于事件,其中单个事件可以删除任意数量的元素。
以下是一些伪代码来说明何时发生这种情况:
// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }
在另一个示例中,想象一个包含以下项目的向量:
// 0 1 2 3 4 5 6 7 8 9
我们开始循环0
并逐个元素进行。在4
,我想删除 elements 1
,4
所以9
我们不能在这里使用正常的循环。