当我尝试删除一个元素时:我转到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)
任何想法?
答案 0 :(得分:1)
指针和迭代器不是一回事。您无法将pair<X,Y>*
分配给map<X,Y>::const_iterator
。
在某些情况下,迭代器只是typedef指针(例如,这通常是std::vector
的情况),但它不是你的代码应该依赖的东西,而且无论哪种方式通常都不是这样的std::map
实现,因为迭代器需要存储在其中的附加信息,以便遍历地图通常实现为的树结构。
答案 1 :(得分:0)
你应该检查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);
}
}
编辑: 你在这里的设计将导致一系列越来越困难的问题,然后很难修复错误。我会重新考虑存储像这样的指针。如果firstMap中的值相同,谁关心哪个特定值被删除?我的猜测是你需要知道这一点,这样你才能正确管理指针。
更好的方法可能是:
答案 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