【问题标题】:map and unordered_map containing pointers to double?map 和 unordered_map 包含指向 double 的指针?
【发布时间】:2013-10-10 19:33:41
【问题描述】:

如果我有一个 std::map 和 std::unordered_map 我怎么能在双精度上使用指针,这样当 unordered_map 更新特定键的双精度值时,这已经反映在 std::map 的相同的“钥匙”?

所以:

unordered_map["1"] = 6 导致 map["1"] 也为 6....

【问题讨论】:

  • 如果其中一个解决方案有帮助,您可能愿意接受。

标签: c++ pointers map reference unordered-map


【解决方案1】:

没有理由不能使用指针。

示例:

#include <iostream>
#include <map>
#include <unordered_map>
#include <memory>

int main()
{
    std::unordered_map<std::string, std::shared_ptr<double>> umap;
    std::map<std::string, std::shared_ptr<double>> omap;

    std::shared_ptr<double> value(new double(1234.5));

    umap.emplace("key", value);
    omap.emplace("key", value);

    std::cout << "umap " << *umap["key"] << "\n";
    std::cout << "omap " << *omap["key"] << "\n";

    *umap["key"] = 9999.1;
    std::cout << "omap " << *omap["key"] << "\n";
}

输出:

umap 1234.5
omap 1234.5
omap 9999.1

【讨论】:

    【解决方案2】:

    可能是这样的:

    std::unordered_map<std::string, double> um;
    std::unordered_map<std::string, double*> om;
    
    om["1"] = &um["1"];
    

    从现在开始,*om["1"] 始终是um 中对应元素的值。只要确保你永远不会从无序地图中删除元素。

    (来源:iterator and reference invalidation rules

    【讨论】:

    • 即使重新散列也会使迭代器和引用失效,不是吗?不仅仅是擦除。
    • @Troy:重新散列使迭代器无效,但引用无效。 (因为它不会移动数据,但会改变迭代顺序。)
    • @rici 很高兴知道 ;)
    • @Troy: 23.2.5p9 “重新散列使迭代器无效,更改元素之间的顺序,并更改哪些桶元素出现在其中,但不会使指针或对元素的引用无效。”
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多