C++ 擦除在while循环中迭代的元素

C++ 擦除在while循环中迭代的元素,c++,deque,C++,Deque,我尝试删除deque中迭代while循环的元素。然而,似乎在删除一个元素后,循环会跳过下一个元素。 代码如下 Example program #include <iostream> #include <string> #include <deque> #include <algorithm> using namespace std; deque<int*> queue; int main() { int * a1 = new i

我尝试删除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;     
}
示例程序
#包括
#包括
#包括
#包括
使用名称空间std;
排队;
int main()
{
int*a1=新的int(0);
int*a2=新的int(2);
int*a3=新int(3);
int*a4=新int(4);
int*a5=新int(5);
队列。推回(a1);
队列。推回(a2);
排队。推回(a3);
排队。推回(a4);
排队。推回(a5);
deque::iterator it=queue.begin();
while(it!=queue.end())
{

std::cout您有未定义的行为,因为您在
delete*it;
处取消对无效迭代器的引用

int * to_del = *it;
it = queue.erase(it);
delete to_del;
但是,您还应该避免在
int
足够的地方使用
int*
,以及在
中有适用内容时编写循环

bool是偶数(inti){return(i%2)=0;}
deque队列{0,2,3,4,5};
queue.erase(std::remove_if(queue.begin()、queue.end()、is_偶数)、queue.end());

您有未定义的行为,因为您在
删除*it;
中取消引用了无效的迭代器。要解决眼前的问题,您需要

int * to_del = *it;
it = queue.erase(it);
delete to_del;
但是,您还应该避免在
int
足够的地方使用
int*
,以及在
中有适用内容时编写循环

bool是偶数(inti){return(i%2)=0;}
deque队列{0,2,3,4,5};
queue.erase(std::remove_if(queue.begin()、queue.end()、is_偶数)、queue.end());

:“所有迭代器和引用都将无效,除非已擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对已擦除元素的引用才会无效”。迭代时不要修改数据结构!这意味着只需执行queue.erase(it)。这样可以吗?:“所有迭代器和引用都是无效的,除非已擦除的元素位于容器的末尾或开头,在这种情况下,只有迭代器和对已擦除元素的引用是无效的”。迭代时不要修改数据结构!这意味着只需执行queue.erase(it)。这可以吗?或者,从C++20及以后,根据,
std::erase_if(queue,[](int x){return(i%2)==0;})
。或者,从C++20及以后,根据,
std::erase_if(queue,[](int x){return return(i%2)==0;})