Скучное-девелоперское

Jan 07, 2011 23:49

Тупое животное. Ну откуда и почему, скажите, ко мне время от времени возвращается это идиотское ощущение, что я худо-бедно умею писать код? Очередной пример глубокой ошибочности этого опасного заблуждения. Интересно только тем, кого живо задевает бессмертное творение Строуструпа. Имеем: hash_map my_map; (любой stl map, по-видимому, сойдёт). Выяснилось (ценой нескольких потерянных часов - говорю же, тупое животное), что проверка наличия элемента/вставка нового элемента (k,v) с использованием оператора my_map[k] = v - черезвычайно неэффективна. Вопрос знатокам - ну-ка объясните, почему? Подсказка: Val - "тяжёлый" класс (скажем, vector(1000)). В контексте c++ эта подсказка, как правило, выдаёт проблему с головой ;) Но если всё ещё есть сомнения, то вторая подсказка: реальная вставка нового элемента происходит сравнительно редко. Часто случается так, что элемент (k,v) уже присутствует. А теперь объясните - почему в таких условиях вышеозначенным оператором пользоваться нельзя? Ответ - завтра :) Вполне подходящий, кстати, вопрос (технический) для interview, по-моему. Пользуйтесь :)

UPD1: опечатка. map[k]=v - тоже, конечно плохо, но я-то пытался вообще вызывать v=map[k]. То есть - "дай мне элемент по ключу а если его нет, то сначала вставь новый и верни мне его". Всего-то. Оказалось, всё совсем не так.

UPD2: Подробности в комментах. map[k] не проверяет сначала на наличие элемента по ключу k. Вместо этого он сразу создаёт новые объекты, да ещё вызывает на них дополнительные copy constructors от души. А потом, если элемент по ключу уже лежит - просто ничего не делает (точнее, возвращает этот элемент).
Previous post Next post
Up