- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
#include <iostream>
#include <map>
int main()
{
std::string name;
std::map<int, int> m = { {1, 1}, {2, 2} };
m.erase(m.end());
std::cout << "Kokoko " << m[1] << std::endl;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+1
#include <iostream>
#include <map>
int main()
{
std::string name;
std::map<int, int> m = { {1, 1}, {2, 2} };
m.erase(m.end());
std::cout << "Kokoko " << m[1] << std::endl;
}
На моем проекте уходит в бесконечный цикл.
ASD_77 08.06.2021 16:22 # 0
bormand 08.06.2021 16:23 # +3
Лолшто.
DypHuu_niBEHb 08.06.2021 16:26 # +2
Кстати, вы будете семяца, но про это даже прямо на цппрейференс написано
The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.
Уранец наверное пытался сделать UB, и посмотреть, что будет
bormand 08.06.2021 16:31 # +3
Прямо как про лом и унитаз в поезде...
gologub 08.06.2021 16:35 # 0
DypHuu_niBEHb 08.06.2021 16:40 # 0
PolinaAksenova 08.06.2021 16:46 # 0
DypHuu_niBEHb 08.06.2021 16:52 # 0
ну правда методы придется переделать, чтобы они удаляли по указатель включительно
bormand 08.06.2021 17:10 # +2
DypHuu_niBEHb 08.06.2021 17:11 # 0
Правда это тоже было бы мерзко
bormand 08.06.2021 17:12 # +1
В паскале из-за этого приходилось писать "от 0 до -1" уводя индексы в минус, угу. Ну или if'ы лепить, чтобы пустой кейс отдельно обрабатывать.
З.Ы. Короче сишный вариант -- это меньшее зло, как мне кажется.
DypHuu_niBEHb 08.06.2021 17:17 # +1
Я вполне верю, что сишный вариант взяли не с потолка, а потому что были какие-то проблемы, но сам по себе он тоже не оч хороший, пушо вводит понятие "неразыменовываеемымымымй указатель", а потом уранцы вон код пишут
bormand 08.06.2021 17:18 # 0
Дык конструкция языка просто заметёт эту проблему под ковёр. В реализации этой конструкции один хуй будет или if или end < begin.
Тлен и безысходность.
DypHuu_niBEHb 08.06.2021 17:20 # 0
>Тлен и безысходность.
ладно, убедили. Эскобар.jpg
bormand 08.06.2021 17:22 # 0
Пустой интервал ничем не отличается от любых других. Да ещё и длину считать легко, всего одно вычитание. Просто юзай end() по назначению и будет тебе счастье.
DypHuu_niBEHb 08.06.2021 17:33 # 0
А вот один "особый случай" показал нам Уранец.
bormand 08.06.2021 17:40 # 0
А ещё можно местами поменять begin() и end(). Тоже "смешно" будет.
DypHuu_niBEHb 08.06.2021 17:42 # 0
он совершенно искренне думает, что должен получиться пустой интервал, а получился UB
Да и вообще в целом нельзя написать такой код, который разыменовывает любой указатель, потому что они могут быть неразыменовываемыми
Так что сишкино решение тоже не идеально
bormand 08.06.2021 17:45 # 0
А кто говорит, что оно идеально? Просто меньшее из джвух зол.
В джаве пустой итератор тебя тоже экцепшоном ёбнет, кстати, если ты полезешь к нему в next().
Steve_Brown 08.06.2021 18:24 # +1
Эта перегрузка принимает не интервал, а итератор. Ожидать, что функция, которая удаляет ровно один элемент, в каких-то случаях не будет ничего удалять... несколько рисковано.
bormand 08.06.2021 17:27 # 0
А это естественная концепция, кстати. Иначе на пустом интервале тебе придётся запретить begin(). Вообще. Потому что его там тоже не разыменовать.
DypHuu_niBEHb 08.06.2021 17:34 # 0
bormand 08.06.2021 17:59 # +2
DypHuu_niBEHb 08.06.2021 18:02 # +3
Desktop 08.06.2021 17:15 # 0
JloJle4Ka 08.06.2021 17:15 # 0
bormand 08.06.2021 17:16 # +1
[0, -1] тогда уж, как в паскале делали. Но это выглядит как говно, особенно с точки зрения ма-те-ма-ти-ки.
DypHuu_niBEHb 08.06.2021 17:19 # +1
Читаемость паскалевого стиля тоже сомнительна..
Desktop 08.06.2021 17:20 # 0
а потому что надо было послать нахуй математику, знаковый size с точки зрения математики и здравого смысла тоже говно, но все едят, потому что кампутиру так проще
Soul_re@ver 08.06.2021 18:27 # +1
В С++ не едят. Поэтому, если пользуешься стандартной либой, приходится или использовать беззнаковый тип или отключать варнинги о нарушении сегрегации по знаковому признаку.
DypHuu_niBEHb 08.06.2021 18:28 # +1
Получится вполне себе нормальное число, даже стандарт не нарушится
Steve_Brown 09.06.2021 12:32 # 0
PolinaAksenova 09.06.2021 15:10 # +1
См. https://abseil.io/tips/171 .
DypHuu_niBEHb 09.06.2021 16:17 # +1
А вот если речь идет НЕ об интах, а например о енумах или указателях на класс (см паттер Null object), то конечно они кал, бо срать в домен костылями не комильфо
Но разумеется optional лучше всегда
bormand 09.06.2021 16:39 # +2
По-хорошему это -5 и нормальные числа должны быть в разных ветвях ADT, чтобы типизация вообще ну никак не давала смешать их между собой или забыть обработать какой-то кейс: Error -5 но Size 42. Но нормальных ADT в мейнстримных языках нет, только костыли в духе optional.
З.Ы. А для скриптушни похуй, конечно. Там и так про типы никто не парится.
DypHuu_niBEHb 09.06.2021 16:49 # 0
Для примера выше, ``AccountBalance`` вообще не мог бы быть signed.
Плохо, что там -5, и плохо что от валидного баланса к ошибке можно перейти простой арифметической операцией
Но я видел код, где люди ищут в сообщении об ошибке подстроку, и строят на этом логику.
И да: сообщение это локализованное.
Так что ERROR как -1 не так и страшны
bormand 09.06.2021 16:51 # 0
Технический овердрафт смотрит на тебя с непоняманием...
Будет забавно, если чел перебрал на 5 рублей и теперь его банк-клиент крашится с ошибкой access denied потому что -5.
DypHuu_niBEHb 09.06.2021 16:55 # 0
Потому что если может быть, то ты сам описал, что будет))
bormand 09.06.2021 17:09 # +1
DypHuu_niBEHb 09.06.2021 17:17 # +2
Это может быть баланс на счету в Интернет магазине. Там отрицательных значений быть не может (магазины в кредит не торгуют)
Есть еще мой "любимый" вид ошибки как в COM HRESULT, где в четырехбайтный инт упаковали severity и facility
Глупые программы выдают его как обычное число, потом у тебя ошибка "2147500037"
bormand 09.06.2021 17:20 # 0
Лолшто.
DypHuu_niBEHb 09.06.2021 17:22 # 0
а что, можно купить в интернет магазине что-то, уйти в минус, и потом через месяц загасить долг?
bormand 09.06.2021 17:27 # 0
PolinaAksenova 09.06.2021 17:21 # 0
DypHuu_niBEHb 09.06.2021 17:23 # 0
https://en.wikipedia.org/wiki/HRESULT#HRESULT_format
gologub 09.06.2021 19:29 # 0
> Die Generic
какие прононсы )))
bormand 09.06.2021 16:45 # +1
(К сожалению запаттернняшить и обмонадить это в крестах не получится, только вот такие вот ифы...).
DypHuu_niBEHb 09.06.2021 16:53 # +1
В джаве дураки придумали хуёвый Optional и он выглядит как говно
Единственный нормальный способ обработки ошибок это такая манда, которую паттернмачишь, и из нее вылазит либо ошибка, либо результат
Любой код, где надо писать
похож на Go
bormand 09.06.2021 16:54 # 0
DypHuu_niBEHb 09.06.2021 16:56 # +1
не понимаю, почему это не завезли в мейнстрим. Даже кокотлиновцы обосрались
bormand 09.06.2021 17:06 # 0
Кстати, checked исключения, в принципе, очень похожи на монадическую обработку ошибок -- ты либо паттерн-няшишь ошибку через try либо она форвардится дальше (при этом у тебя в типе функции это явно указано).
DypHuu_niBEHb 09.06.2021 17:13 # 0
Потому у нас в проекте в случайных кусках кода то тут, то там расставлены catch, которые ловят всякие разные исключения.
Где увидели ошибку в логах, туда и воткнули catch.
Checked исключения в джаве действительно решали эту проблему, но они были настолько отвратительными (и тяжелыми, если стек трейс не отключить), что ими никто не пользовался.
Котлиновцы еще умеют возвращать null в случае ошибки (null safety это проверяет), но саму ошибку ты не вернешь.
Мне советовали юзать вот
https://arrow-kt.io/docs/0.10/patterns/error_handling/#either
но поскольку это не в стандартной библиотеке, то разумеется нигде и неиспользуется
Потом они завезли вот
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-result/
но тут ошибкой может быть только Throwable, что (имхо) тупо
bormand 09.06.2021 17:19 # 0
Да сойдёт, наверное... Тебе же с джавой интегрироваться всё-таки. Может понадобиться дальше прокинуть как исключение.
С другой стороны без монад явная обработка ошибок нахуй не нужна. Привет, го.
DypHuu_niBEHb 09.06.2021 17:25 # 0
Я могу хотеть вернуть строку ошибкой, нафиг мне ее заворачивать:)
У нас для котлина был напилен свой sealed class, который можно было паттернматчить
Ты получаешь абстрактрный Result<Petuh, Error> и матчишь его.
Он либо наследник Error, либо Petuh.
bootcamp_dropout 08.06.2021 19:34 # +2
В бинарном поиске если итерироваться по полуоткрытому с конца интервалу то всегда искомое значение != верхней границе и меньше кейсов нужно обработать
DypHuu_niBEHb 08.06.2021 18:16 # +2
https://pbs.twimg.com/media/E3WKlxLWEAImmtr?format=jpg&name=900x900
bootcamp_dropout 08.06.2021 19:36 # 0
DypHuu_niBEHb 08.06.2021 19:38 # +2