在 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());
我尝试在 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());