使用地图擦除 - 从包含指向另一个地图的指针的地图中删除

时间:2010-09-19 16:16:20

标签: c++

当我尝试删除一个元素时:我转到secondMap,它在第二个字段中包含指向第一个地图的指针,现在当我尝试删除它时,它给了我一些问题:

multimap<SortKey,T> firstMap;
multimap<SearchKey,pair<const SortKey,T>*> secondMap;



   template <class T,class SortKey, class SearchKey> T GarageDataBase<T,SortKey,SearchKey>::Remove(SearchKey toRemove) 
{
 multimap<SearchKey,pair<const SortKey,T>*>::iterator it;
 it=secondMap.find(toRemove);
 multimap<SortKey,T>::const_iterator itr;
 itr=(it->second);//pointer to a pair in the first map
 firstMap.erase(itr);

}

我得到:

error C2664: 'std::_Tree_iterator<_Mytree> std::_Tree<_Traits>::erase(std::_Tree_const_iterator<_Mytree>)' : cannot convert parameter 1 from 'std::_Tree_const_iterator<_Mytree>' to 'std::_Tree_const_iterator<_Mytree>'

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion) 

任何想法?

3 个答案:

答案 0 :(得分:1)

指针和迭代器不是一回事。您无法将pair<X,Y>*分配给map<X,Y>::const_iterator

在某些情况下,迭代器只是typedef指针(例如,这通常是std::vector的情况),但它不是你的代码应该依赖的东西,而且无论哪种方式通常都不是这样的std::map实现,因为迭代器需要存储在其中的附加信息,以便遍历地图通常实现为的树结构。

答案 1 :(得分:0)

  1. erase()不适用于const迭代器。
  2. 你不能使用一个集合中的迭代器来擦除另一个集合中的元素。
  3. 你应该检查find()不返回end()以避免结果访问的不良

    multimap<SearchKey,pair<const SortKey,T>*>::iterator it; it=secondMap.find(toRemove);

     if (it != secondMap.end())
     { 
      multimap<SortKey,T>::iterator itr;
      itr=firstMap.find(it->second->first);//find matching element in the first map
    
      if (itr != firstMap.end())
      { 
       firstMap.erase(itr);
      }
     }
    
  4. 编辑: 你在这里的设计将导致一系列越来越困难的问题,然后很难修复错误。我会重新考虑存储像这样的指针。如果firstMap中的值相同,谁关心哪个特定值被删除?我的猜测是你需要知道这一点,这样你才能正确管理指针。

    更好的方法可能是:

    • 使用boost :: shared_ptr作为容器值,以便 refcounting不是你的问题 - final erase()只是删除 你根本不使用指针。
    • 除非您的对象复制成本高,否则不要使用指针,只需使用对象实例作为容器值。那么资源管理就不那么重要了。

答案 2 :(得分:0)

使用正确的类型作为第二个地图的值,而不是指针。使用typedef会更容易看到你在做什么:

typedef std::multimap<SortKey,T> first_mmap;
typedef std::multimap<SearchKey, typename first_mmap::iterator > second_mmap;

first_mmap firstMap;
second_mmap secondMap;

你不能删除const迭代器,所以删除const:

second_mmap::iterator it = secondMap.find(toRemove);
first_mmap::iterator itr = it->second;

当你在secondMap中找不到密钥时,你应该处理这个案例:

if (it == secondMap.end()) ...; // handle the error