我有两个容器std :: map; 如何从包含指向对象的指针的容器中删除数据,知道指针(地址)?
std::map<K, CacheEntry<T>> values_;
std::map<CacheEntry<T>*, K> timeMap_;
我如何在timeMap_中找到项目?
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&tmp, key));
deleteFromTimeMap(&tmp);
deleteFromTimeMap :
void deleteFromTimeMap(const CacheEntry<T>* findItem)
{
details::LockGuard lk(mutex_);
auto it = timeMap_.find(findItem); //Error
timeMap_.erase(it);
}
答案 0 :(得分:2)
问题是你的地图存储非常量指针,但是你试图擦除常量指针。只需从const
签名中删除deleteFromTimeMap
。
答案 1 :(得分:0)
map :: erase可以接受一个键类型,如下所示:
void deleteFromTimeMap(const CacheEntry<T>* findItem)
{
details::LockGuard lk(mutex_);
timeMap_.erase(findItem);
}
请参阅http://www.cplusplus.com/reference/map/map/erase/
并且,根据我的理解,在此代码中:
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&tmp, key));
deleteFromTimeMap(&tmp);
你希望timeMap_的键是指向values_中CacheEntry对象的指针,对吗? 但是由于std :: make_pair()和map :: insert()构造了新对象,所以timeMap_的键不指向values_中的对象,而是指向堆栈对象tmp,在tmp被解构后,keyMap_中的键是悬挂指针,这很危险。
也许,你需要的是:
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&values[key], key));
deleteFromTimeMap(&tmp);