我在徘徊 - 我可以使用std::shared_ptr
作为地图密钥吗?
更具体地说 - 指针的引用计数器可能与分配给映射时的值不同。
是否可以在地图中正确识别?
答案 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<
。具体来说,只比较指针值,而不是参考计数。
显然,尖头物体不是比较的一部分。否则,通过修改指向对象并使地图中的顺序与比较不一致,可以轻易地使地图无效。