Jeśli twoja aplikacja jest krytyczna pod względem szybkości, doradzę za pomocą operatora [], ponieważ tworzy ona w sumie 3 kopie oryginalnego obiektu, z których 2 są obiektami tymczasowymi i prędzej czy później zniszczonymi jako.
Ale w insert () tworzone są 4 kopie oryginalnego obiektu, z czego 3 są obiektami tymczasowymi (niekoniecznie „tymczasowymi”) i są niszczone.
Co oznacza dodatkowy czas na: 1. Przydział pamięci jednego obiektu 2. Jedno dodatkowe wywołanie konstruktora 3. Jedno dodatkowe wywołanie destruktora 4. Deallokacja pamięci jednego obiektu
Jeśli twoje obiekty są duże, konstruktory są typowe, destruktory uwalniają wiele zasobów, powyżej punktów liczy się jeszcze więcej. Jeśli chodzi o czytelność, uważam, że oba są wystarczająco uczciwe.
To samo pytanie przyszło mi do głowy, ale nie z powodu czytelności, ale szybkości. Oto przykładowy kod, dzięki któremu dowiedziałem się o punkcie, o którym wspomniałem.
class Sample
{
static int _noOfObjects;
int _objectNo;
public:
Sample() :
_objectNo( _noOfObjects++ )
{
std::cout<<"Inside default constructor of object "<<_objectNo<<std::endl;
}
Sample( const Sample& sample) :
_objectNo( _noOfObjects++ )
{
std::cout<<"Inside copy constructor of object "<<_objectNo<<std::endl;
}
~Sample()
{
std::cout<<"Destroying object "<<_objectNo<<std::endl;
}
};
int Sample::_noOfObjects = 0;
int main(int argc, char* argv[])
{
Sample sample;
std::map<int,Sample> map;
map.insert( std::make_pair<int,Sample>( 1, sample) );
//map[1] = sample;
return 0;
}