我有boost::unordered_map<int, Animal*>
我需要删除其中值与Animal* a;
相同指针的所有插入( a 被赋予动物* 之类的参数,我有不同的键在地图中相同的动物* 指针在几个地方。)
boost::unordered_map<int, Animal*> mp;
Animal* rex = new Animal("Rex");
mp[1]=rex;
mp[2]=rex;
mp[9]=rex;
如何删除值为rex的所有记录,之后只从堆中删除rex一次?
答案 0 :(得分:6)
您需要遍历列表并删除与您要搜索的指针值匹配的记录。
typedef boost::unordered_map<int, Animal*> AnimalMap;
AnimalMap mp;
void DeleteStuff(Animal* searchPointerValue)
{
for(AnimalMap::iterator it = mp.begin(); it < mp.end(); )
{
if(it->second == searchPointerValue)
{
// erase() invalidates the iterator but returns a new one
// that points to the next element in the map.
it = mp.erase(it);
}
else
{
++it; // Only bump the iterator if no erase is done
// since unordered_map::erase() takes care of that for us
}
}
// now we can delete the animal as you so desire
delete searchPointerValue;
}
答案 1 :(得分:2)
使用智能指针,如boost::shared_ptr
,而不是原始指针。这样您就可以毫无顾虑地从地图中删除元素。
使用带引用计数的智能指针,您可以简单地遍历地图并擦除具有您想要的值的每个元素。
答案 2 :(得分:2)
typedef boost::unordered_map<int, Animal*> mapType;
mapType myMap;
mapType::iterator it = myMap.begin();
while(it != myMap.end())
{
if(it->second == current_pointer)
it = mp.erase(it);
else
++it;
}
delete current_pointer; // Don't forget this
答案 3 :(得分:0)
如何将std::remove_if
与合适的仿函数一起使用?
std::remove_if(std::begin(mp), std::end(mp),
[](const std::pair<int, Animal*>& pair)
{ return (pair.second == rex); });
当然,除非你delete rex
,否则这可能会导致内存泄漏。使用smart pointers是一个好主意。