在迭代过程中删除向量的唯一元素?
Removing the only element of a vector during iteration?
我对迭代器有点困惑。我想删除一个恰好具有特定值的向量成员,即使它是向量中唯一的元素。
我有一个类的向量。我想做的是,当类成员的一个变量(例如width
)具有一定的值时,该类实例将从向量中永久删除。让我们假设类仅由一个构造函数组成,将width
和height
、公共变量和析构函数作为其公共函数。
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
确实在您擦除的元素之后向元素返回了一个迭代器,因此您不应该递增它。
相关文章:
- 如何在 c++ 中迭代数组中的唯一元素
- tbb:current_unordered_map()-向量中每个唯一元素的ID
- 如何在c++中找到数组的最小唯一元素
- 类实例的地址是否等于类中唯一元素的地址
- 识别结构C++中的唯一元素
- 在矢量中使用特定条件检查唯一元素
- 在迭代过程中删除向量的唯一元素?
- 在唯一元素上进行迭代器,而无需构造容器
- 实例化 std::vector 的唯一元素,而无需复制构造函数
- 从数组中删除唯一元素的最有效方法
- 在我试图创建一个载体中包含C 中的唯一元素的矢量时,发现不起作用
- 将整数分配给 std::vector 中排序的唯一元素
- 使用线程打印数组中的唯一元素
- 唯一元素堆栈的容器
- 元素在给定范围内的子矩阵中唯一元素的数目
- 创建包含唯一元素的优先级队列
- 自定义比较器,将唯一元素插入到c++中的集合中
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- C++数据结构,用于存储两组唯一元素之间的多个关系
- 具有唯一元素和按索引访问的容器