如何在地图中找到指针
How to find in map the pointer?
我有两个容器标准::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);
相关文章:
- 从矢量或地图中删除共享指针
- 如何将元素插入到标准::地图的共享指针中?
- 无法将智能指针插入地图
- 从地图复制到指针列表
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 如何在地图中使用结构指针
- 为什么通用参考概念不适用于函数指针的地图插入
- C 通过指针的地图进行迭代
- 从地图擦除后访问指针
- C 如何在地图指针中的键增量值
- std ::地图没有父母指针
- 如何在两个包含指针的地图中创建列表
- 如何将模板函数指针作为值参数添加到地图中
- 使用地图模板函数指针
- 在Unorderd地图中删除指针
- 通过EMPLEPE()将对象指针插入地图中
- 如何在具有非常量指针键的地图中通过常量指针键查找
- 如何通过向量/地图对对象使用多个指针
- 分割故障,可能的原因:功能指针,多线程,STL地图等
- 如何从地图返回标准::p空气的指针并将其放入vector<*std::p air...>