2014-06-16 11 views
7

Ich war Wandern - kann ich std::shared_ptr als Map-Schlüssel verwenden?Verwenden von Std Shared_ptr als Std :: Map Key

genauer gesagt - der Referenzzähler des Zeigers könnte sich von dem Wert unterscheiden, den er hatte, als er der Karte zugewiesen wurde.

Wird es in der Karte korrekt identifiziert?

Antwort

7

Ja, Sie können. std::shared_ptr hat operator< auf eine Weise definiert, die für die Verwendung der Kartenschlüssel geeignet ist. Insbesondere werden nur Zeigerwerte verglichen, nicht Referenzzählwerte.

+0

Beachten Sie, dass wenn Sie das "Aliasing-Konstruktor" von 'std :: shared_ptr' verwenden, je nach Anwendungsfall verwenden Sie betrachten wünschen können [' std :: owner_less' ] (http://en.cppreference.com/w/cpp/memory/owner_less) als Vergleichsfunktor der Karte. Dadurch erhalten Sie die Reihenfolge basierend auf dem Zeiger auf das gesamte Objekt und nicht auf das Unterobjekt, auf das direkt mit dem 'shared_ptr' verwiesen wird. – tomjakubowski

9

Ja, Sie können ... aber seien Sie vorsichtig. operator< ist in Bezug auf den Zeiger, nicht in Bezug auf die spitz definiert.

#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; 

} 

druckt

Hello=World 
Hello=