【问题标题】:How to find in map the pointer?如何在地图中找到指针?
【发布时间】:2015-01-21 06:38:03
【问题描述】:

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

【问题讨论】:

  • 那么错误是什么?请发布 MCVE。

标签: c++ pointers dictionary


【解决方案1】:

问题是您的地图存储非常量指针,但您正试图擦除一个常量指针。只需从deleteFromTimeMap 签名中删除const

【讨论】:

    【解决方案2】:

    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 被破坏后, timeMap_ 中的 key 是悬空指针,这很危险。

    也许,你需要的是这样的:

    CacheEntry<T> tmp(value);
    values_.insert(std::make_pair(key, tmp));
    timeMap_.insert(std::make_pair(&values[key], key));
    deleteFromTimeMap(&tmp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多