删除std映射中的重复值

aja*_*ari 3 c++ stl map

我有一个

map<char,my_class*> mymap;
Run Code Online (Sandbox Code Playgroud)

其内容如下.

mymap[0]=('a', 0x1);
mymap[1]=('b',0x2);
mymap[3]=('c',0x3);
mymap[4]=('d',0x1);
Run Code Online (Sandbox Code Playgroud)

如您所见,我们对键'a'和'd'具有相同的值.我有一个for循环来删除地图中的指针.

for ( it=mymap.begin() ; it != mymap.end(); it++ ){
  delete it->second;
}
Run Code Online (Sandbox Code Playgroud)

它崩溃是因为它试图删除0x1两次.我试过这样做

for ( it=mymap.begin() ; it != mymap.end(); it++ ){
  if(!it->second){
      delete it->second;
      it->second = NULL;
  }
}
Run Code Online (Sandbox Code Playgroud)

即使这样也会尝试将指针设置为NULL两次,这会导致异常.在地图中删除上述重复值的最佳方法是什么?

Cho*_*ett 5

NPE的答案shared_ptr很好.但是如果你被迫使用真正的指针,我可能会这样做:

set<my_class*> values;
for (it=mymap.begin(); it != mymap.end(); it++)
{
  // insert.second will be false if the value is already in the set
  if (values.insert(it->second).second)
    delete it->second;
}

// Make sure you do something with mymap to ensure you don't double-delete later!
Run Code Online (Sandbox Code Playgroud)

  • @JonathanWakely这有什么帮助?将一个指针设置为null不会更改容器中任何其他指针的值. (2认同)