C++ STL迭代器:断言错误

C++ STL迭代器:断言错误,c++,stl,iterator,erase,C++,Stl,Iterator,Erase,为什么以下代码会产生断言错误:表达式:列表迭代器不兼容 #include <list> using namespace std; int main() { list<int> a; a.push_back(1); list<int>::iterator iter=a.begin(); a.erase(iter); iter==a.end(); } #包括 使用名称空间std; int main() { 清单a; a

为什么以下代码会产生断言错误:
表达式:列表迭代器不兼容

#include <list>
using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    list<int>::iterator iter=a.begin();
    a.erase(iter);

    iter==a.end();
}
#包括
使用名称空间std;
int main()
{
清单a;
a、 推回(1);
列表::迭代器iter=a.begin();
a、 擦除(iter);
iter==a.end();
}

a
更改时(例如通过删除元素),给定集合
a
上的迭代器将无效。

您要做的是:

#include <list>
using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    list<int>::iterator iter=a.begin();
    iter = a.erase(iter);
}
#包括
使用名称空间std;
int main()
{
清单a;
a、 推回(1);
列表::迭代器iter=a.begin();
iter=a.erase(iter);
}

当擦除
iter
时,它失效。我认为无效迭代器只能用于赋值,甚至不能与任何东西进行比较。你可能想用

iter = a.end();

擦除后迭代器无效。在您的情况下,擦除本身会在删除最后一个元素时返回(您将其删除)结束迭代器,这对于所有类型的容器中的所有迭代器都不正确。哪种类型的容器不正确?您可以
pop_back()<代码> >我的代码> STD::向量<代码>集合>代码> A<代码>没有我的迭代器指向代码中间的某处> A/C>跳过节拍。以此类推。如果您编写了
iter=a.end()
,因为您已经替换了无效的迭代器,那么这将是很好的,但是因为您编写了
iter==a.end()
,您正在比较一个无效的迭代器,这将导致不兼容的警告