擦除while循环中迭代的元素
Erase element iterating in a while loop
我试图在deque迭代while循环中删除元素。然而,似乎在擦除一个元素后,循环会跳过下一个元素。代码如下
Example program
#include <iostream>
#include <string>
#include <deque>
#include <algorithm>
using namespace std;
deque<int*> queue;
int main()
{
int * a1 = new int(0);
int * a2 = new int(2);
int * a3 = new int(3);
int * a4 = new int(4);
int * a5 = new int(5);
queue.push_back(a1);
queue.push_back(a2);
queue.push_back(a3);
queue.push_back(a4);
queue.push_back(a5);
deque<int * >::iterator it = queue.begin();
while(it != queue.end())
{
std::cout << "Element :" << **it << std::endl;
//remove all elements are divided by 2
if((**it&1) == 0)
{
deque<int * >::iterator cur = (it+1);
std::cout << "Erase " << **it << std::endl;
queue.erase(std::remove(queue.begin(), queue.end(), *it), queue.end());
delete *it;
it = cur;
}
else
{
++it;
}
}
std::cout << "End" << std::endl;
}
输出为以下
*元素:0擦除0
要素:3
元素:4擦除4
结束*
似乎元素2和5被跳过了。
您有未定义的行为,因为您在delete *it;
处取消引用了一个无效的迭代器。为了解决眼前的问题,你需要像这样的东西
int * to_del = *it;
it = queue.erase(it);
delete to_del;
但是,您也应该避免在int
足够的情况下使用int *
,以及在<algorithm>
中有适用内容时编写循环
bool is_even(int i) { return (i % 2) == 0; }
std::deque<int> queue { 0, 2, 3, 4, 5 };
queue.erase(std::remove_if(queue.begin(), queue.end(), is_even), queue.end());
相关文章:
- 擦除while循环中迭代的元素
- 对于set上的循环-获取next元素迭代器
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 高级选择排序 - 在一次迭代中搜索两个元素
- 访问要输出的矢量迭代器元素
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 位集元素迭代的抽象
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 如何将元素插入和迭代到这种映射.C++
- 如何通过查找迭代器结果分配给一组对的元素
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 如何在集合中迭代替代元素(或进行特定大小的飞跃)?
- 无法将 std::set 中的元素迭代器插入到 std::list
- 使用std :: remove_reference获取STL容器的元素迭代器
- C++ 从地图的第二个元素迭代
- 在未排序向量中查找第 k 个最小元素(迭代)