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