【问题标题】:Using std shared_ptr as std::map key使用 std shared_ptr 作为 std::map 键
【发布时间】:2014-08-06 01:00:57
【问题描述】:

我在徘徊 - 我可以使用 std::shared_ptr 作为地图键吗?

更具体地说 - 指针的引用计数器可能与分配给映射时的值不同。

会在地图上正确识别吗?

【问题讨论】:

    标签: c++ map key std


    【解决方案1】:

    是的,你可以……但要小心。 operator< 是根据指针定义的,而不是根据指向的。

    #include <memory>
    #include <map>
    #include <string>
    #include <iostream>
    
    int main() {
    
        std::map<std::shared_ptr<std::string>,std::string> m;
    
        std::shared_ptr<std::string> keyRef=std::make_shared<std::string>("Hello");
        std::shared_ptr<std::string> key2Ref=std::make_shared<std::string>("Hello");
    
        m[keyRef]="World";
    
        std::cout << *keyRef << "=" << m[keyRef] << std::endl;
        std::cout << *key2Ref << "=" << m[key2Ref] << std::endl;
    
    }
    

    打印

    Hello=World
    Hello=
    

    【讨论】:

      【解决方案2】:

      是的,你可以。 std::shared_ptr 以适合映射键使用的方式定义了 operator&lt;。具体来说,只比较指针值,不比较引用计数。

      显然,指向对象不是比较的一部分。否则,很容易通过修改指向对象并使地图中的顺序与比较不一致而使地图无效。

      【讨论】:

      • 请注意,如果您使用std::shared_ptr 的“别名构造函数”,根据您的用例,您可能需要考虑使用std::owner_less 作为地图的比较函子。这将使您根据指向整个对象的指针而不是shared_ptr 直接指向的子对象进行排序。
      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多