2016-04-22 36 views
5
class TestClass { 
    public: 
    TestClass(string s) { 

    } 
    }; 

Quando c'è TestClass, ho capito la differenza tra colloco e inserire (colloco costrutti sul posto mentre le copie dell'inserto)C++ Set colloco vs inserto quando un oggetto è già stato creato

set<TestClass> test_set; 
    test_set.insert(TestClass("d")); 
    test_set.emplace("d"); 

Tuttavia, se ci è già un oggetto TestClass, come sono diversi in termini di meccanismo e preformance?

set<TestClass> test_set; 
    TestClass tc("e"); 
    test_set.insert(tc); 
    test_set.emplace(tc); 

risposta

4

emplace esegue il proprio lavoro inoltrando perfettamente i parametri al costruttore corretto (utilizzando probabilmente un posizionamento nuovo nella maggior parte delle implementazioni).
Per questo motivo, nel tuo caso inoltra un riferimento lvalue e quindi invoca probabilmente il costruttore di copie.
Qual è ora la differenza con uno push_back che chiama esplicitamente il costruttore di copie?

Meyers cita anche quello in uno dei suoi libri, e dice che non vi è alcun guadagno effettivo nel chiamare emplace se si dispone già di un'istanza dell'oggetto.

2

uso attento della colloco permette al nuovo elemento da costruire evitando inutili copia o spostare operazioni. Il costruttore del nuovo elemento viene chiamato con esattamente gli stessi argomenti forniti al colloco, inoltrati via std :: avanti (args) ....

Riferimento here mi porta a credere che tale "uso non attento "porterebbe a meccanismi e prestazioni molto simili a quelli dell'inserto, i cui dettagli esatti potrebbero essere specifici del compilatore.