2015-01-21 44 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