что в мэпе существует ключ.
Можно проверить через find, но просто из спортивного интереса - корректно ли обернуть вставку в try/catch?
И если это годная практика - то откуда взять название исключения?
не надо использовать исключения, если можно обойтись без них. Причём тут они и не помогут
есть insert, emplace и try_emplace, выбирайте на любой вкус
А почему исключений, по возможности, следует избегать? Это неформальное правило оформления кода или как то с производительностью/юзабилити связано?
скорее с производительностью, да и try/catch усложняет восприятие кода
мне казалось быстрее должно быть, т.к. проверка на наличие ключа выполнится гарантированно лишь один раз. Впрочем, нутро это я не знаю, чисто спортивный интерес. Спасибо)
Ну не коды возврата же использовать
именно их и использует стандартная библиотека
Да он гонит просто.
Ну зачем исключения, чтобы вставить в map с проверкой существования, лол
А при чем тут вообще исключения, с чего они вдруг появятся при вставке в map?
Ну ты сказочник, надо было так и написать, а ты выдал сказку. Новичёк прочитает, и не понимая запомнит: "исключения это плохо"
Исключения - для исключительных случаев, не для рутинной проверки. Все хорошо к месту
Название исключения взять из документации на используемую функцию или класс. Но расскажи, откуда возьмутся исключения при вставке в map?
Я уже потом, при написании, понял что ниоткуда, можно просто брать и вставлять (но это не точно, т.к. написать - написал, но еще не запускал). В пайтоне, говорят, трай/кетчи на каждом шагу используют. Я оттуда и перенёс логику мышления на этот мэп, думал ежели вставить по несуществующему ключу - то строгий си++ заругается. А он, оказывается, не такой уж строгий в отношении мэп оказался.
Си++ в этом плане наоборот даже слишком нестрогий my_map[key] = value сработает независимо от того, есть ли ключ в словаре, что имхо и зря
А я написал map[key].push_back(obj) в пустой map. Это же сработает для map<string,vector<class>>? А то я лежу и думаю об этом)
Да, сработает. Если key нет, то создастся пустой вектор и запушится в него
Логики ноль тут. Исключения применяться тогда, когда выполнение кода далее невозможно, когда заказанная операция не может быть исполнена. Вот при чтении из map по ключу иногда может быть исключение, а с чего при вставке?
Да, это известная тема
Предполагаемая мною логика была такова: 1. Си++ любит ругаться 2. Значит, наверняка, заругается если вставить по несуществующему ключу. 3. Значит надо как-нибудь проверять перед вставкой 4. Нафига все эти проверки - сделаем как в питоне трай/кетчем. Ежели ключа нет - сгенерится исключение, тут то мы ключ и добавим, а потом и значение. Заодно сэкономим операцию проверки ифом на каждом цикле.
"Если вставить по несуществующему ключу" особенно классно звучит.
Почему бред? Тут вот пишут же что зря си++ не ругается в этом случае с мэпом. Значит общая логика мышления хотя бы чуть-чуть но имеет основание.
Расскажи, где в питоне при вставке в словарь исключения?
Не знаю. Я вообще эти мэпы недолюбливаю. Я думал про более общий случай в питоне, что там вместо предварительных доп проверок обычной практикой является использование трай/кетчей
Думай хоть немного иногда...
Нахуа этот гемор в п. 4? Если нет ключа, то будет исключение и тогда мы добавим ключ и значение... Замедлим все (как в питоне) вылетом исключения. Супер решение! Чем не устраивает то, что сделано сейчас в мапе: если нет ключа, он добавится?
более того, если тебе не нужно это поведение, ты можешь юзать find()
Я не говорил что не устраивает. Я предположил, не изучив предварительно документацию, что в c++ процедура добавления элемента в мап требует существования ключа в момент добавления. Т.е. сделал неверное предположение о процедуре добавления элемента не разобравшись в манах. В этом моя недоработка.
Кто тогда добавит первый элемент, если процедура добавления требует чтобы уже существовал этот ключ?
Я думал что процедура имеет 2 этапа: 1. Объявление ключа 2. Наполнение мапа по существующему ключу
Обсуждают сегодня