如何在地图中找到指针?
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);
}
问题是您的地图存储了非常量指针,但您正试图删除一个常量指针。只需从 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_的key没有指向values_中的对象,而是指向栈对象tmp,tmp被析构后,key in timeMap_是悬空指针,这很危险。
也许,你需要的是这个:
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&values[key], key));
deleteFromTimeMap(&tmp);
我有两个容器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);
}
问题是您的地图存储了非常量指针,但您正试图删除一个常量指针。只需从 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_的key没有指向values_中的对象,而是指向栈对象tmp,tmp被析构后,key in timeMap_是悬空指针,这很危险。
也许,你需要的是这个:
CacheEntry<T> tmp(value);
values_.insert(std::make_pair(key, tmp));
timeMap_.insert(std::make_pair(&values[key], key));
deleteFromTimeMap(&tmp);