使用std::shared_ptr作为std::map的键

27

我在思考 - 我能否将std::shared_ptr用作地图键?

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

它能被正确识别为地图键吗?

2个回答

27

是的,你可以... 但要小心。operator< 是基于指针而非指向的内容定义的。

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=

26

是的,你可以。 std::shared_ptr已经定义了operator<以适当的方式用于map键的使用。具体来说,只比较指针值,而不是引用计数。

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


4
请注意,如果您使用std::shared_ptr的“别名构造函数”,根据您的用例,您可能需要考虑使用std::owner_less作为映射的比较函数。这将基于指向整个对象的指针进行排序,而不是直接由shared_ptr指向的子对象。 - tomjakubowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接