如何在地图中找到指针?

时间:2015-01-21 06:38:04

标签: c++ pointers dictionary

我有两个容器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);
            }

2 个答案:

答案 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);