如何在地图中找到指针

How to find in map the pointer?

本文关键字:指针 地图      更新时间:2023-10-16

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

并从时间图中删除

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_ 的键在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);