我在思考 - 我能否将std::shared_ptr
用作地图键?
更具体地说 - 指针的引用计数可能与分配给地图时的值不同。
它能被正确识别为地图键吗?
我在思考 - 我能否将std::shared_ptr
用作地图键?
更具体地说 - 指针的引用计数可能与分配给地图时的值不同。
它能被正确识别为地图键吗?
是的,你可以... 但要小心。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=
是的,你可以。 std::shared_ptr
已经定义了operator<
以适当的方式用于map键的使用。具体来说,只比较指针值,而不是引用计数。
显然,所指向的对象不是比较的一部分。否则,通过修改指向的对象并使map中的顺序与比较不一致,轻易地可以使地图无效。
std::shared_ptr
的“别名构造函数”,根据您的用例,您可能需要考虑使用std::owner_less
作为映射的比较函数。这将基于指向整个对象的指针进行排序,而不是直接由shared_ptr
指向的子对象。 - tomjakubowski