Оба выполняют разные вещи.
m[key] = val;
Вставит новую пару ключ-значение, если key
еще не существует, или перезапишет старое значение, сопоставленное с key
, если оно уже существует.
m.insert(make_pair(key, val));
Вставит пару только в том случае, если key
еще не существует, она никогда не перезапишет старое значение.Итак, выберите соответственно тому, что вы хотите достичь.
На вопрос, что более эффективно: профиль.: P Наверное, первый способ, который я бы сказал, хотя.Назначение (иначе копия) имеет место для обоих способов, поэтому единственная разница заключается в построении.Как все мы знаем и должны реализовать, конструкция по умолчанию должна быть в основном неактивной и, следовательно, очень эффективной.Копия это именно то - копия.Таким образом, одним способом мы получаем «без операции» и копию, а вторым способом мы получаем две копии.
Редактировать : В конце концов, доверяйте тому, что говорит вам ваше профилирование.Мой анализ был неудачным, как @Matthieu упоминает в своем комментарии, но это было мое предположение.:)
Тогда у нас будет C ++ 0x, и двойная копия на втором пути будет нулевой, так как пара теперь может быть просто перемещена.Так что, в конце концов, я думаю, что это возвращается к моему первому пункту: используйте правильный путь, чтобы выполнить то, что вы хотите сделать.