使用std shared_ptr作为std :: map键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用std shared_ptr作为std :: map键相关的知识,希望对你有一定的参考价值。

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

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

它会在地图中正确识别吗?

答案

是的你可以。 std::shared_ptr以适合地图密钥使用的方式定义operator<。具体而言,仅比较指针值,而不是参考计数。

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

另一答案

是的,你可以......但要小心。 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=

以上是关于使用std shared_ptr作为std :: map键的主要内容,如果未能解决你的问题,请参考以下文章

为啥不推荐使用 std::shared_ptr::unique() ?

使用相同的函数但重载不同的 std::tr1::shared_ptr<T> 和 std::shared_ptr<T>

`std::optional` 比 `std::shared_ptr` 和 `std::unique_ptr` 有啥优势?

[C++][原创]std::shared_ptr简单使用

使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例

命名空间“std”中没有名为“shared_ptr”的类型