Se o seu aplicativo for crítico quanto à velocidade, aconselho o uso do operador [], pois ele cria um total de 3 cópias do objeto original, das quais 2 são objetos temporários e, mais cedo ou mais tarde, serão destruídos como.
Mas no insert (), 4 cópias do objeto original são criadas, das quais 3 são objetos temporários (não necessariamente "temporários") e são destruídas.
O que significa tempo extra para: 1. Uma alocação de memória de objetos 2. Uma chamada de construtor extra 3. Uma chamada de destruidor extra 4. Uma desalocação de memória de objetos
Se seus objetos são grandes, os construtores são típicos, os destruidores liberam muitos recursos, os pontos acima contam ainda mais. Quanto à legibilidade, acho que ambas são justas o suficiente.
A mesma pergunta veio à minha mente, mas não sobre legibilidade, mas velocidade. Aqui está um exemplo de código através do qual eu vim a conhecer o ponto que mencionei.
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;
}