如何在地图中找到指针?

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