在迭代期间删除向量的唯一元素?

Removing the only element of a vector during iteration?

我对迭代器有点困惑。我想删除恰好具有特定值的向量成员,即使它是向量中的唯一元素。

我有一个 class 的向量。我想做的是,当 class 成员变量之一(例如 width)具有特定值时,此 class 实例将从向量中永久删除。假设 class 仅由一个构造函数构成,包含 widthheight、两个 public 变量和一个析构函数作为其 public 函数。

vector<Rectangle> vect1;

Rectangle memVar1(3, 5);
Rectangle memVar2(6, 10);

vect1.push_back(memVar1);
vect1.push_back(memVar2);

因此它将遍历向量的所有成员,搜索是否有任何高度为 5。

for(std::vector<myClass>::iterator it = vect1.begin(); it != vect1.end(); ++it) {
    if (it->height == 5) {
    //delete the element from the vector, and so memVar2 will be the only element and it will be in slot 0 of the vector now.
    it = vect1.erase(it);
    } 
}

这按预期工作,如果向量中只有一个元素,恰好有不需要的高度 5,就会出现问题。我想从向量中删除该元素,但随后也安全退出迭代。在上面的例子中,我可以在将它设置为 vect1.erase(it) 之后放入一个 break 但是如果我的擦除是在迭代循环内的一个开关内,这将不起作用,例如,和所以当它离开 switch 语句时,我需要一个条件变量从那里退出。

所以我想知道是否有一种不需要我使用 break 的方法来避免在 switch 语句中擦除时代码混乱?

在循环中删除元素时,您必须考虑到当您删除索引 i 处的元素时,下一个元素位于索引 i 而不是索引 i+1 处。此外,擦除向量中的元素会使您擦除位置处和之后的所有迭代器失效(实际上您已经考虑到了这一点)。因此循环应该类似于:

for(auto it = vect1.begin(); it != vect1.end(); /* no increment here */) {
    if (it->height == 5) {
        it = vect1.erase(it);
    } else {
        ++it;
    }
}

PS: 写完答案才发现我的解释是假的。正确的解释是 erase 已经 return 一个指向你删除的元素之后的元素的迭代器,所以你不应该递增它。