我已经在堆栈溢出上遇到了这篇文章,并发现了迭代中删除列表中的元素的方式。我想尝试使用map
和list
同样的尝试。我的list
有一个分段错误,但我没有使用map
得到一个。为什么这样?
以下是两者的代码。
使用列表:
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int>l ;
l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);
list<int>::iterator it;
for(it = l.begin();it!=l.end();it++){
l.erase(it);
cout<<"Give me some output..n";
}
return 0;
}
Output :
Give me some output..
Segmentation fault (core dumped)
使用地图:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, int>m ;
m[1] = 1;m[2] = 2;m[3] = 3;m[4] = 4;
map<int,int>::iterator it;
for(it = m.begin();it!=m.end();it++){
m.erase(it);
cout<<"Give me some output..n";
}
return 0;
}
Output :
Give me some output..
Give me some output..
Give me some output..
Give me some output..
不应该列出迭代器和映射迭代器显示相同的行为??
旁边:
我面临的实际问题是我在一个大程序中使用了地图,并试图用上面提到的错误方法从中删除元素,并且我得到了分段错误。然后,我访问了上述链接并解决了问题。,但不应该两个代码给出分段故障。使用相同代码段的两个代码如何显示不同的行为。一个代码很小,因此编译器能够单独纠正它?
list::erase
和 map::erase
状态:
参考文献和迭代器对擦除的元素无效。其他参考文献和迭代器不受影响。
随后打电话给it++
时,您正在增加无效的引用是不确定的行为。
幸运的是,这是一个简单的问题,可以解决两个容器的erase
-Methods返回下一个有效的迭代器,因此,如果出于某种原因,您不仅要调用clear
,您可以做:
for(auto it = cbegin(l); it != cend(l); it = l.erase(it)) cout << "Give me some output..n";