2014-06-16 3 views
7

방황하고있었습니다. std::shared_ptr을지도 키로 사용할 수 있습니까?std shared_ptr을 std :: map 키로 사용

더 구체적으로는 포인터의 참조 카운터가지도에 할당되었을 때의 값과 다를 수 있습니다.

지도에서 올바르게 식별됩니까?

답변

7

가능합니다. std::shared_ptr은지도 키 사용에 적합한 방식으로 정의 된 operator<입니다. 특히 포인터 값만이 참조 카운트가 아닌 비교됩니다.

+0

주 ] (http://en.cppreference.com/w/cpp/memory/owner_less)지도의 비교 functor로. 이것은'shared_ptr'에 의해 직접 지시 된 하위 객체보다는 오히려 전체 객체에 대한 포인터에 기반하여 당신을 정렬하게 할 것입니다. – tomjakubowski

9

네, 할 수는 있지만 조심하세요. operator<은 포인터의 관점에서 정의 된 것이지 지적 된 점이 아닙니다. 당신이 당신의 사용 사례에 따라 표준 : shared_ptr``의 "앨리어싱 생성자"를 사용하는 경우는 [`표준 : owner_less` 사용을 고려할 수 있음을

#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= 
관련 문제