如何从地图中删除具有相同值但不同键的所有记录?

时间:2013-04-23 11:16:49

标签: c++ boost stl

我有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一次?

4 个答案:

答案 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是一个好主意。