地图和列表的迭代器显示不同的行为



我已经在堆栈溢出上遇到了这篇文章,并发现了迭代中删除列表中的元素的方式。我想尝试使用maplist同样的尝试。我的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::erasemap::erase状态:

参考文献和迭代器对擦除的元素无效。其他参考文献和迭代器不受影响。

随后打电话给it++时,您正在增加无效的引用是不确定的行为。

幸运的是,这是一个简单的问题,可以解决两个容器的erase -Methods返回下一个有效的迭代器,因此,如果出于某种原因,您不仅要调用clear,您可以做:

for(auto it = cbegin(l); it != cend(l); it = l.erase(it)) cout << "Give me some output..n";

相关内容

  • 没有找到相关文章

最新更新