【问题标题】:Removing map element by value按值删除地图元素
【发布时间】:2009-05-28 18:05:41
【问题描述】:

我会保持简短。

我试图在字符串和对象指针之间保留一个映射,因此,我使用 std::map。我有一个管理器,它是一个跟踪地图的全局类,每当调用对象的析构函数时,它都会告诉管理器它已被删除。

我能想到的唯一方法是在地图中搜索对象。有没有有效的 STL 解决方案来解决这个问题?是否也存在通过键进行有效搜索的地图?

【问题讨论】:

    标签: c++ stl map


    【解决方案1】:

    不,除了通过比较值进行迭代之外,没有一种有效的方法可以使用 std::map 执行此操作。

    但是,大多数情况下,值的键是可以从值本身计算出来的。例如,使用 Person 对象的 Name 属性作为键。经理是否可以存储键/值对列表而不是值本身。这将解决您的问题,而无需重写新算法。

    或者,您也可以在管理器类上保留一个反向映射。本质上是关键的价值。这样您就可以使用它来计算稍后要删除的密钥。

    【讨论】:

    • 谢谢!我什至没有想过让对象存储密钥本身。绝对是比拥有第二张地图更好的解决方案。
    【解决方案2】:

    看着SGI's documentation for the STL

    地图有一个重要的属性: 将新元素插入地图 不会使迭代器无效 指向现有元素。擦除一个 地图中的元素也没有 使任何迭代器无效,除了 当然,对于实际上 指向正在执行的元素 删除。

    因此,您可以将迭代器存储到对象内的映射中,并在需要删除其条目时将其用作常量时间查找键。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 请注意,您需要键和值都唯一才能使用双向映射。 std::map 只需要唯一的键。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2017-03-10
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多