[英]How to find in map the pointer?
我有两个容器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);
}
问题是您的地图存储了非const指针,但是您正在尝试删除一个const指针。 只需从deleteFromTimeMap
签名中删除const
。
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销毁后,timeMap_的键为悬空的指针,这很危险。
也许,您需要的是:
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&values[key], key));
deleteFromTimeMap(&tmp);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.