【发布时间】:2014-08-06 01:00:57
【问题描述】:
我在徘徊 - 我可以使用 std::shared_ptr 作为地图键吗?
更具体地说 - 指针的引用计数器可能与分配给映射时的值不同。
会在地图上正确识别吗?
【问题讨论】:
我在徘徊 - 我可以使用 std::shared_ptr 作为地图键吗?
更具体地说 - 指针的引用计数器可能与分配给映射时的值不同。
会在地图上正确识别吗?
【问题讨论】:
是的,你可以……但要小心。 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=
【讨论】:
是的,你可以。 std::shared_ptr 以适合映射键使用的方式定义了 operator<。具体来说,只比较指针值,不比较引用计数。
显然,指向对象不是比较的一部分。否则,很容易通过修改指向对象并使地图中的顺序与比较不一致而使地图无效。
【讨论】:
std::shared_ptr 的“别名构造函数”,根据您的用例,您可能需要考虑使用std::owner_less 作为地图的比较函子。这将使您根据指向整个对象的指针而不是shared_ptr 直接指向的子对象进行排序。