C++ c++;映射,在使用扩展for循环进行迭代时删除元素是否安全?
我有一个映射,其中键是整数,值是整数的向量。现在这些向量包含一些重复的元素,我想删除它们。所以,我使用C++ c++;映射,在使用扩展for循环进行迭代时删除元素是否安全?,c++,iterator,C++,Iterator,我有一个映射,其中键是整数,值是整数的向量。现在这些向量包含一些重复的元素,我想删除它们。所以,我使用 sort(map.begin(),map.end()) map.erase(unique(map.begin(),map.end()),map.end()); 一切正常。但是当我使用扩展for循环时 for(auto i:map) 那么这不起作用,但当我使用: for(auto i=map.begin();i!=map.end();i++) 以下是完整代码: #define loopi(
sort(map.begin(),map.end())
map.erase(unique(map.begin(),map.end()),map.end());
一切正常。但是当我使用扩展for循环时
for(auto i:map)
那么这不起作用,但当我使用:
for(auto i=map.begin();i!=map.end();i++)
以下是完整代码:
#define loopi(i,n) for(int i=0;i<n;i++)
map<int,vector<int>>m;
m[0]={1,22,22,3};
m[2]={2,1,11,11,1,6};
m[5]={2,2,2,33,5};
for(auto i:m){
cout<<i.second.size()<<endl;
sort(i.second.begin(),i.second.end());
i.second.erase(unique(i.second.begin(),i.second.end()),i.second.end());
cout<<i.second.size()<<endl;
loopi(j,i.second.size()) cout<<i.second[j]<<" ";
cout<<endl;
}
cout<<endl;
for(auto i:m){
cout<<i.second.size()<<endl;
loopi(j,i.second.size()) cout<<i.second[j]<<" ";
cout<<endl;
}
使用这个:
for(auto i=m.begin();i!=m.end();i++){
cout<<i->second.size()<<endl;
sort(i->second.begin(),i->second.end());
i->second.erase(unique(i->second.begin(),i->second.end()),i->second.end());
cout<<i->second.size()<<endl;
loopi(j,i->second.size()) cout<<i->second[j]<<" ";
cout<<endl;
}
cout<<endl;
for(auto i=m.begin();i!=m.end();i++){
cout<<i->second.size()<<endl;
loopi(j,i->second.size()) cout<<i->second[j]<<" ";
cout<<endl;
}
因此,在第一种情况下,它不是删除元素。您的第一个解决方案执行相同的操作,而是在实际元素的副本上执行,该副本随后被丢弃。在
for(auto-i:m)
中,i
是一对对
,由于您不是通过引用(即for(auto&i:m)
),因此您在该循环中修改的向量是您拥有的原始向量的副本
第二个示例之所以有效,是因为您使用的是迭代器,它不会创建数据的副本。我不明白这个问题。你没有从地图上删除任何东西。您只是在更改值。我使用的是擦除。您在向量上使用的是擦除,而不是映射。for(auto I:m)
-I
是键值对的副本。您只能擦除该副本中的元素。您应该通过引用获取i
:for(auto&i:m)
返回一个新的迭代器,您可以使用它继续迭代。我建议你用它。
for(auto i=m.begin();i!=m.end();i++){
cout<<i->second.size()<<endl;
sort(i->second.begin(),i->second.end());
i->second.erase(unique(i->second.begin(),i->second.end()),i->second.end());
cout<<i->second.size()<<endl;
loopi(j,i->second.size()) cout<<i->second[j]<<" ";
cout<<endl;
}
cout<<endl;
for(auto i=m.begin();i!=m.end();i++){
cout<<i->second.size()<<endl;
loopi(j,i->second.size()) cout<<i->second[j]<<" ";
cout<<endl;
}
4
3
1 3 22
6
4
1 2 6 11
5
3
2 5 33
3
1 3 22
4
1 2 6 11
3
2 5 33