2014-06-16 20 views
7

Stavo vagando - posso usare std::shared_ptr come chiave di mappa?Utilizzo di std shared_ptr come std :: map key

in modo più specifico - il contatore di riferimento del puntatore potrebbe essere diverso dal valore che aveva quando assegnato alla mappa.

Sarà identificato correttamente nella mappa?

risposta

7

Sì, è possibile. std::shared_ptr ha operator< definito in modo appropriato per l'utilizzo della chiave della mappa. In particolare, vengono confrontati solo i valori del puntatore, non i conteggi di riferimento.

+0

Si noti che se si utilizza il "costruttore aliasing" di 'std :: shared_ptr', a seconda del vostro caso d'uso si può prendere in considerazione l'utilizzo [' std :: owner_less' ] (http://en.cppreference.com/w/cpp/memory/owner_less) come funtore di confronto della mappa. Questo ti porterà a ordinare in base al puntatore a tutto l'oggetto, piuttosto che al subobject puntato direttamente da 'shared_ptr'. – tomjakubowski

9

Sì, puoi ... ma attenzione. operator< è definito in termini di puntatore, non in termini di puntatore.

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

} 

stampe

Hello=World 
Hello= 
Problemi correlati