使用std shared_ptr作为std :: map键

时间:2014-06-16 08:44:54

标签: c++ map key std

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

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

是否可以在地图中正确识别?

2 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:12)

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

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