使用std shared_ptr作为std :: map键

sar*_*ara 13 c++ key std map

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

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

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

jsa*_*der 19

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

}
Run Code Online (Sandbox Code Playgroud)

版画

Hello=World
Hello=
Run Code Online (Sandbox Code Playgroud)


Woj*_*wka 14

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

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

  • 请注意,如果使用`std :: shared_ptr`的"别名构造函数",根据您的用例,您可能需要考虑使用[`std :: owner_less`](http://en.cppreference.com/w/ cpp/memory/owner_less)作为地图的比较仿函数.这将使您根据指向整个对象的指针进行排序,而不是由`shared_ptr`直接指向的子对象. (3认同)