2015-01-21 19 views
-1

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

那么,什么是错误?请发布一个MCVE。 – juanchopanza 2015-01-21 06:40:46

回答

0

地图::擦除可以接受密钥类型,像这样:

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

的问题是你的地图存储非const指针,但你试图抹掉常量之一。请从deleteFromTimeMap签名中删除const

+0

大谢谢你。 – 2015-01-21 06:41:51