在C++11中,从向量中删除元素,同时对其进行迭代
Delete elements from a vector in C++11 while iterating over it
我的应用程序需要迭代一个向量,并删除某些不满足要求的元素。哪种方式最正确?我认为以下方式是不正确的。原因:我有分段错误。
std::vector<ObjectX> vec1;
//Fill in vec1
std::vector<ObjectX>::iterator itVec1 = vec1.begin();
for(;itVec1 != vec1.end(); ++itVec1) {
if (Oracle(*itVec1)) vec1.erase(itVec1);
}
当您调用时
vec1.erase(itVec1);
您使CCD_ 1无效。之后,++itVec1
是不对的。它会导致未定义的行为。您需要稍微更改一下代码。
for( ; itVec1 != vec1.end(); ) {
if (Oracle(*itVec1))
{
itVec1 = vec1.erase(itVec1);
}
else
{
++itVec1;
}
}
您可以使用Erase remove Idiom:删除所有锅炉板代码
vec1.erase(std::remove_if(vec1.begin(), vec1.end(), Oracle), vec1.end());
您可以将正确的项放入一个新的向量中。
相关文章:
- 擦除while循环中迭代的元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 高级选择排序 - 在一次迭代中搜索两个元素
- 访问要输出的矢量迭代器元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 位集元素迭代的抽象
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何将元素插入和迭代到这种映射.C++
- 如何通过查找迭代器结果分配给一组对的元素
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 将迭代器作为 3 个元素的滑动窗口,可以超调边界(可能使用 Boost)
- 在任一方向上迭代容器并擦除元素
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素