Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc.
А теперь: std::unordered_map std::chrono::duration::seconds std::strong_ordering::greater
Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc.
И было тривиально легко подраться за символ в какой-то программе, просто не зная, что он уже есть в библиотеке или в соседнем модуле.
O>А теперь: std::unordered_map std::chrono::duration::seconds std::strong_ordering::greater O>Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста.
Он стремится туда же, с мелкими поправками. И это правильно.
Здравствуйте, ononim, Вы писали:
O>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. O>А теперь: std::unordered_map std::chrono::duration::seconds std::strong_ordering::greater O>Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста.
Очень много символов. Всем нравится называть функцию open или close. Поэтому приходится использовать или длинные имена, или пространства имён. Но поскольку в мире C++ стоит бардак полный, используется и то и другое.
Здравствуйте, netch80, Вы писали:
N>Он стремится туда же, с мелкими поправками. И это правильно.
Что правильного в том, что я каждый раз заново гуглю, чтобы измерить время либо добавить в программу ГПСЧ? Потому что эту идеологически выдержанную херабору невозможно блин запомнить.
В отличие от
srand(time(NULL));
...
int i = rand() % n;
...
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
O>>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. N>И было тривиально легко подраться за символ в какой-то программе, просто не зная, что он уже есть в библиотеке или в соседнем модуле.
Вот я пишу на плюсах с 2000года примерно. И вот ни разу у меня не было проблемы что моя функция подралася с open/fopen и тп. Мне это во всяком случае не запомнилось.
А вот как написали рядом, факт того что все эти std::chrono и std::strong_ordering приходится каждый раз гуглить — напрягает с тех пор как придумали с++17.
А если гугл отключат? Вы понимаете что цивилизация упадет в нищету и начнет со скуки строить пирамиды, потому что никто не сможет вспомнить как правильно написать оператор космического корабля?
O>>А теперь: std::unordered_map std::chrono::duration::seconds std::strong_ordering::greater O>>Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста. N>Он стремится туда же, с мелкими поправками. И это правильно.
Я считаю что многословность человеческих языков — это изобретенный эволюцией и социумом метод избыточного кодирования информации, чтобы сказки передавались из поколения в поколения не теряя смысла и всякие гонцы, которых посылали пешкодралом в соседнее королевство с устной речью, хоть чтото запомнили и передали, даже с бодуна. В современном мире с этой функцией гораздо лучше справляются коды Рида Соломона и на более высоком уровне можно считать что текстовая информация искажениям не подвергается, а следовательно можно излагать мысли кртко.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>>>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. N>>И было тривиально легко подраться за символ в какой-то программе, просто не зная, что он уже есть в библиотеке или в соседнем модуле. O>Вот я пишу на плюсах с 2000года примерно. И вот ни разу у меня не было проблемы что моя функция подралася с open/fopen и тп. Мне это во всяком случае не запомнилось. O>А вот как написали рядом, факт того что все эти std::chrono и std::strong_ordering приходится каждый раз гуглить — напрягает с тех пор как придумали с++17. O>А если гугл отключат? Вы понимаете что цивилизация упадет в нищету и начнет со скуки строить пирамиды, потому что никто не сможет вспомнить как правильно написать оператор космического корабля?
Почему-то на шарпе у меня вообще не было проблем с тамошней длиной и многословностью. А в плюсах есть.
В мире мудрых мыслей: «Иди на нефильтрованный там загон для врагов и щизофреников» (VladD2).
Здравствуйте, ononim, Вы писали:
O>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. O>А теперь: std::unordered_map std::chrono::duration::seconds std::strong_ordering::greater O>Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста.
Ну, остались же std::cin и std::cout. Вот ими и пользоваться.
--
Справедливость выше закона. А человечность выше справедливости.
O>А если гугл отключат? Вы понимаете что цивилизация упадет в нищету и начнет со скуки строить пирамиды, потому что никто не сможет вспомнить как правильно написать оператор космического корабля?
Здравствуйте, T4r4sB, Вы писали:
N>>Он стремится туда же, с мелкими поправками. И это правильно.
TB>Что правильного в том, что я каждый раз заново гуглю, чтобы измерить время либо добавить в программу ГПСЧ? Потому что эту идеологически выдержанную херабору невозможно блин запомнить.
Ты смешиваешь две совершенно разные вещи, и я не уверен, что не намеренно: 1) Сложность API; 2) Длина названий.
Тривиально построить объект на десяток строк, который будет твой пример с rand() заворачивать в себя с достаточной длиной и значений, и цикла (как делают например в mt19937 и чего нет в rand).
И точно так же можно на сишном API с именами в один уровень и аббревиатурами построить что-то сверхсложное. Почитай, например, про sendmsg.
Здравствуйте, ononim, Вы писали:
O>>>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. N>>И было тривиально легко подраться за символ в какой-то программе, просто не зная, что он уже есть в библиотеке или в соседнем модуле. O>Вот я пишу на плюсах с 2000года примерно. И вот ни разу у меня не было проблемы что моя функция подралася с open/fopen и тп. Мне это во всяком случае не запомнилось. O>А вот как написали рядом, факт того что все эти std::chrono и std::strong_ordering приходится каждый раз гуглить — напрягает с тех пор как придумали с++17. O>А если гугл отключат? Вы понимаете что цивилизация упадет в нищету и начнет со скуки строить пирамиды, потому что никто не сможет вспомнить как правильно написать оператор космического корабля?
С++, разумеется, какашка, но есть cppreference с локальной установкой в браузер, так что в нищету не упадём. Я пользуюсь, когда уезжаю далеко от цивилизации. Для извращенцев есть вариант в виде man pages.
Здравствуйте, ononim, Вы писали:
O>>>Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc. N>>И было тривиально легко подраться за символ в какой-то программе, просто не зная, что он уже есть в библиотеке или в соседнем модуле. O>Вот я пишу на плюсах с 2000года примерно. И вот ни разу у меня не было проблемы что моя функция подралася с open/fopen и тп. Мне это во всяком случае не запомнилось.
А у меня дралось. Навскидку — с access(), getlogin(), log() (кто-то решил её определить для логгирования, логично же! (каламбур не намеренно), clear(), надоело дальше смотреть подсказки. Борьба с этим, как обычно — префиксы, но в отличие от C++ namespaces надо их писать каждый раз.
O>А вот как написали рядом, факт того что все эти std::chrono и std::strong_ordering приходится каждый раз гуглить — напрягает с тех пор как придумали с++17.
Про chrono — могу только повторить, что писал только что рядом — что сложность самого API и длина идентификаторов — это несвязанные понятия. cmsg в Unix или всякие SECURITY_DESCRIPTOR в Windows — классические примеры, как без пространств имён можно сделать такое, что без бутылки не разберёшься, как его использовать.
Зато вынесение связанных понятий чего-то сложного в одно пространство имён — на пользу.
Так что выставляйте претензии не тем, кто внёс всё временно́е в std::chrono, а тем, кто его сделал таким убойно универсальным, что фиг запомнишь, где там именно нужно втыкать хреновину в шиздюлину (или наоборот?) и закреплять погребенью.
O>А если гугл отключат? Вы понимаете что цивилизация упадет в нищету и начнет со скуки строить пирамиды, потому что никто не сможет вспомнить как правильно написать оператор космического корабля?
А вы понимаете, что то же программирование уже существовало полвека без гугла и с ним спокойно обходились печатными материалами? Или не хотите помнить?
Я вообще не понимаю смысл такого сравнения — "гугл отключат" (херасе, чтобы "отключили" и гугл и яндекс и всех прочих, это что ж сделать надо), но если и так, то опыт наших родителей показывает, что проблема решалась задолго до.
O>Я считаю что многословность человеческих языков — это изобретенный эволюцией и социумом метод избыточного кодирования информации, чтобы сказки передавались из поколения в поколения не теряя смысла и всякие гонцы, которых посылали пешкодралом в соседнее королевство с устной речью, хоть чтото запомнили и передали, даже с бодуна. В современном мире с этой функцией гораздо лучше справляются коды Рида Соломона и на более высоком уровне можно считать что текстовая информация искажениям не подвергается, а следовательно можно излагать мысли кртко.
От замены std::chrono::duration::seconds на std::chr::dur::sc или даже std.chr.dur.sc легче не станет.
N>От замены std::chrono::duration::seconds на std::chr::dur::sc или даже std.chr.dur.sc легче не станет.
std::age::sec а duration не нужен, или вообще лучше std::seconds
кстати они немножко начали осознавать:
inline constexpr std::strong_ordering equivalent
a valid value indicating equivalence (neither ordered before nor ordered after), the same as equal
(public static member constant)
inline constexpr std::strong_ordering equal
a valid value indicating equivalence (neither ordered before nor ordered after), the same as equivalent
(public static member constant)
думаю скоро добавят std::strong_ordering::operator=(int v) а позже еще и дойдут до человеческого std::equal и (для особенных) std::weak_equal и тп, а тип — std::cmp std::weak_cmp
и хорошо что shared_ptr придумали до комитета, иначе был бы std::pointer::reference_counted::strong и std::pointer::reference_counted::weak, но к сожалению с hash_map это не прокатило, трындючие ящики таки утрындели приверженцев здравого смысла.
Как много веселых ребят, и все делают велосипед...
O>>... T>В каменном веке весь код приходилось писать руками. Это потом подвезли подсказки и автокомплит. Может поэтому и решили не экономить на длине.
вот бы теперь подвезли автодекомплит, для тех кто по-прежнему читает глазами
Как много веселых ребят, и все делают велосипед...
Здравствуйте, rg45, Вы писали:
r> _NN>https://devdocs.io/ r> _NN>Можно скачать локально. r> _NN>Умеет не только C++. r> А джавы и сишарпа нету. Как же так?
OpenJDK есть. Вот только не понимаю зачем. Если у тебя есть установленная jdk с сорцами, там все доки будут локально, прямо из IDE. И не только jdk, а практически любая либа. То же касается многих вещей там вроде git.
Здравствуйте, rg45, Вы писали:
r> ·>OpenJDK есть. r> Ну это JDK. А сам язык? Как мне написать мой первый "Hello World"?
Ну вроде там все доки это reference, а не tutorials. А учебники уж очень разные. Смотря какой ты "Hello World" хочешь, консольный, или гуй, или веб, или rest-сервис в докер и т.п.
Здравствуйте, ·, Вы писали:
·>Ну вроде там все доки это reference, а не tutorials. А учебники уж очень разные. Смотря какой ты "Hello World" хочешь, консольный, или гуй, или веб, или rest-сервис в докер и т.п.
Конечно, все это references. Только для C++ есть references по языку, для Java нету.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>·>Ну вроде там все доки это reference, а не tutorials. А учебники уж очень разные. Смотря какой ты "Hello World" хочешь, консольный, или гуй, или веб, или rest-сервис в докер и т.п. R>Конечно, все это references. Только для C++ есть references по языку,
Который ты имеешь в виду?
R>для Java нету.
Ну можно выкачать в оффлайн ~1000 страниц пдфку JLS... Но это не про hello world...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
R>>Конечно, все это references. Только для C++ есть references по языку, ·>Который ты имеешь в виду?
Вот этот, например: https://devdocs.io/cpp/language. И не только это, там много ещё есть интересного во вкладках "Language", "Keywords", "Metaprogramming", etc, что относится сугубо к языку.
Среди прочего, есть документация по функции main: https://devdocs.io/cpp/language/main_function, которой более чем достаточно, для написания "Hello World".
R>>для Java нету. ·>Ну можно выкачать в оффлайн ~1000 страниц пдфку JLS... Но это не про hello world...
Ну это-то понятно, что много чего можно выкачать.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, rg45, Вы писали:
R>·>Который ты имеешь в виду? R>Вот этот, например: https://devdocs.io/cpp/language. И не только это, там много ещё есть интересного во вкладках "Language", "Keywords", "Metaprogramming", etc, что относится сугубо к языку.
А, ну аналог jls, да.
R>Среди прочего, есть документация по функции main: https://devdocs.io/cpp/language/main_function, которой более чем достаточно, для написания "Hello World".
на это похоже https://docs.oracle.com/javase/specs/jls/se21/html/jls-1.html#jls-1.2
R>·>Ну можно выкачать в оффлайн ~1000 страниц пдфку JLS... Но это не про hello world... R>Ну это-то понятно, что много чего можно выкачать.
Угу... И неясно накой этот devdocs.io. Док слишком много, чтобы слить все в одну кучу, да так чтобы в оффлайн кеш браузера уместилось. И вот https://devdocs.io/offline "вдохновляет"
Note: your browser may delete DevDocs's offline data if your computer is running low on disk space and you haven't used the app in a while.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Угу... И неясно накой этот devdocs.io. Док слишком много, чтобы слить все в одну кучу, да так чтобы в оффлайн кеш браузера уместилось. И вот https://devdocs.io/offline "вдохновляет" ·>
Note: your browser may delete DevDocs's offline data if your computer is running low on disk space and you haven't used the app in a while.
Хотели как лучше.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, T4r4sB, Вы писали:
N>>Он стремится туда же, с мелкими поправками. И это правильно.
TB>Что правильного в том, что я каждый раз заново гуглю, чтобы измерить время либо добавить в программу ГПСЧ? Потому что эту идеологически выдержанную херабору невозможно блин запомнить. TB>В отличие от TB>
TB>srand(time(NULL));
TB>...
TB>int i = rand() % n;
TB>...
TB>
АПИ стало гораздо шире, а не в именах дело.
Раньше был единственный способ получать рандомы (кстати, а способ/алгоритм был зафиксирован в стандарте?), а сейчас куча разных алгоритмов рандомов, и всё в стандарте описано
Здравствуйте, Pzz, Вы писали:
Pzz>Очень много символов. Всем нравится называть функцию open или close. Поэтому приходится использовать или длинные имена, или пространства имён. Но поскольку в мире C++ стоит бардак полный, используется и то и другое.
В мире C++ как раз порядок. Бардак же от совместимости с сишечкой
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, cppguard, Вы писали:
_NN>>https://devdocs.io/ _NN>>Можно скачать локально. _NN>>Умеет не только C++.
R>А джавы и сишарпа нету. Как же так?
C .NET всё сложно в плане лицензии и в плане возможности вытащить в удобном формате
There's still a major blocker for me to add your docs to DevDocs, in that I'd need a static version to scrape/convert into DevDocs format locally (https://docs.microsoft.com/en-us/dotnet/api/ doesn't work / isn't crawlable without JavaScript + the documentation is huge, so scraping the website isn't really an option), but this is unrelated to this GH issue, so I'll close it.
Здравствуйте, Marty, Вы писали:
M>Здравствуйте, _NN_, Вы писали:
_NN>>https://devdocs.io/ _NN>>Можно скачать локально. _NN>>Умеет не только C++.
M>Клёвая тема. Только про bat-файлы ничего нет
Для них отдельный сайт: https://ss64.com/nt/
Надо проверить, что там с лицензией если можно добавить на devdocs.
Здравствуйте, _NN_, Вы писали:
M>>Клёвая тема. Только про bat-файлы ничего нет
_NN>Для них отдельный сайт: https://ss64.com/nt/ _NN>Надо проверить, что там с лицензией если можно добавить на devdocs.
Здравствуйте, ononim, Вы писали:
N>>От замены std::chrono::duration::seconds на std::chr::dur::sc или даже std.chr.dur.sc легче не станет. O>std::age::sec а duration не нужен,
"duration не нужен" — это, как говорят автомобилисты, до первого столба, когда у тебя вдруг где-то образуется 4050 год потому, что неправильно применены объекты на сложение, или 1 год вдруг преобразовался к юлианскому календарю и сократился на 10 дней потому, что вычитание.
Кроме длительности (duration) нужен ещё и период — как сделали в RFC 9581.
chrono, конечно, сложноват, но не в этом месте.
O>и хорошо что shared_ptr придумали до комитета, иначе был бы std::pointer::reference_counted::strong и std::pointer::reference_counted::weak,
Ну, такие длинные сократили бы. Например, std::smartptr::shared.
O> но к сожалению с hash_map это не прокатило, трындючие ящики таки утрындели приверженцев здравого смысла.
cppreference.com переадресовывает hash_map в unordered_map. Ты что имел в виду?
Здравствуйте, ononim, Вы писали:
o> Вот раньше все было кр.и.пнтно: std, fopen, open, malloc/realloc.
Раньше было лучше!
o> А теперь: std::unordered_map
Чем hash_map не устроил, неясно.
o> std::chrono::duration::seconds
Вообще-то оно std::chrono::seconds. Вполне ок.
o> std::strong_ordering::greater
А надо как?
o> Ватафак? Что за словоблудие?
Раньше надо было подключать какую-нибудь либу, в которой все имена были, как правило, с каким-то магическим префиксом.
А какая вообще разница? При написании есть IDE, при чтении читаешь всё равно не буквы, а слова.
N>"duration не нужен" — это, как говорят автомобилисты, до первого столба, когда у тебя вдруг где-то образуется 4050 год потому, что неправильно применены объекты на сложение, или 1 год вдруг преобразовался к юлианскому календарю и сократился на 10 дней потому, что вычитание.
duration как самостоятельный объект — ок (хотя название конечно опять же — period было бы читабельнее и писабельнее), а вот duration в качестве скоупа для seconds — лишнее. Создается впечатление что писатели STL забыли что они пишут не код для самих себя, а бибилиотеку для людей, которым вобщемто начхать на ее внутренности.
UPD: мне тут написали
что есть есть и альяс std::chrono::seconds ну чтож, вот она, борьба бобра с ослом в пределах отдельно взятого комитета. Еслиб они документировали в первую очередь понятные альясы, а многоэтажные оставляли для внутреннего пользования — мир был бы чуточку лучше.
O>>и хорошо что shared_ptr придумали до комитета, иначе был бы std::pointer::reference_counted::strong и std::pointer::reference_counted::weak, N>Ну, такие длинные сократили бы. Например, std::smartptr::shared.
Оптимист.
O>> но к сожалению с hash_map это не прокатило, трындючие ящики таки утрындели приверженцев здравого смысла. N>cppreference.com переадресовывает hash_map в unordered_map. Ты что имел в виду?
Я имел ввиду то, что hash_map вначале появился в бусте. И shared_ptr вначале появился в бусте, но при принятии в стандарт — наименование первого показалось черезчур коротким некоторым любителям длинный речей. А shared_ptr повезло больше.
Верните в комитет прагматиков, которые придумали названия std::map, std::set, std::iota, std::cerr и уберите любителей потрындеть. Изза них плюсы сильно отрываются от реальных проблем. Нейминг — это лишь одна и наиболее очевидная грань этой проблемы.
Как много веселых ребят, и все делают велосипед...
·>А какая вообще разница? При написании есть IDE, при чтении читаешь всё равно не буквы, а слова.
std::strong_ordering Foo::operator <=>(const Foo &other) const
{
int r = name.compare(other.name);
if (r != 0) {
return (r < 0) ? std::strong_ordering::less : std::strong_ordering::greater;
}
return std::strong_ordering::equal;
}
std::cmp Foo::operator <=>(const Foo &other) const
{
int r = name.compare(other.name);
if (r != 0) {
return (r < 0) ? std::less : std::greater;
}
return std::equal;
}
ну вот то есть совсем нет никакой разницы в читабельности обоих вариантов?
У меня на прошлой работе как то контора купила старпатчик у которых в проекте были пятиэтажные нэймспейсы, такая себе либа-хрущевка. Вероятно те стартаперы со временем пробрались в С++ комитет.
Как много веселых ребят, и все делают велосипед...
O>ну вот то есть совсем нет никакой разницы в читабельности обоих вариантов?
Если тебе так глаза мозолит, чем using не угодил? Но я как-то не вижу принципиальной разницы. Если ещё учесть в реальности вместо Foo будет какой-нибудь InstrumentClassifier (или ты предложишь писать InstrmClsfr?), то вообще мелочи.
А как ты предлагаешь обозвать всякие weak_ordering и partial_ordering?
Кстати, вот const глаза мозолит больше, ибо разумной инфы никакой, но писать надо.
O>У меня на прошлой работе как то контора купила старпатчик у которых в проекте были пятиэтажные нэймспейсы, такая себе либа-хрущевка. Вероятно те стартаперы со временем пробрались в С++ комитет.
Ну не надо про крайности, а то пошлём тебя сапёром работать. Там в моде 3-4 буквенные идентификаторы на всё. Вот увидишь KNA1, KNVS, VTTK, KONH, T001L и сразу так порадуешься.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ononim, Вы писали:
N>>"duration не нужен" — это, как говорят автомобилисты, до первого столба, когда у тебя вдруг где-то образуется 4050 год потому, что неправильно применены объекты на сложение, или 1 год вдруг преобразовался к юлианскому календарю и сократился на 10 дней потому, что вычитание. O>duration как самостоятельный объект — ок (хотя название конечно опять же — period было бы читабельнее и писабельнее), а вот duration в качестве скоупа для seconds — лишнее. Создается впечатление что писатели STL забыли что они пишут не код для самих себя, а бибилиотеку для людей, которым вобщемто начхать на ее внутренности.
Вопрос дискретности представления временны́х параметров вообще-то существенный. Параметризовать, например, секундами и наносекундами — совершенно разный результат по цене. Особенно это было важно при создании библиотеки, да и сейчас — на 32-битной платформе оперировать 64-битными целыми сложно, а если потребуется ещё толще — тем более.
"Скоуп" в моей записи был не прямо из chrono, там дискрет представления — параметр шаблона.
O>UPD: мне тут написали
что есть есть и альяс std::chrono::seconds ну чтож, вот она, борьба бобра с ослом в пределах отдельно взятого комитета. Еслиб они документировали в первую очередь понятные альясы, а многоэтажные оставляли для внутреннего пользования — мир был бы чуточку лучше.
До определённой степени так и есть.
std::chrono::seconds(C++11) duration type with Period std::ratio<1>
O>>> но к сожалению с hash_map это не прокатило, трындючие ящики таки утрындели приверженцев здравого смысла. N>>cppreference.com переадресовывает hash_map в unordered_map. Ты что имел в виду? O>Я имел ввиду то, что hash_map вначале появился в бусте. И shared_ptr вначале появился в бусте, но при принятии в стандарт — наименование первого показалось черезчур коротким некоторым любителям длинный речей. А shared_ptr повезло больше. O>Верните в комитет прагматиков, которые придумали названия std::map, std::set, std::iota, std::cerr и уберите любителей потрындеть. Изза них плюсы сильно отрываются от реальных проблем. Нейминг — это лишь одна и наиболее очевидная грань этой проблемы.
К unordered_map у меня другие претензии, посерьёзнее, чем просто именование. По-нормальному это должен был быть концепт, лишённый всех специфических граблей типа перебора корзин.
Стандартизация того, что корзины 1) есть, 2) их только один набор — очень жёстко зажимает реализацию до closed addressing hash map с рывочной пересборкой. По эффективности получается амортизированное O(1), но не стабильное O(1), как было раньше в Dinkumware и вслед Microsoft STL. А это значит, что критичные к постоянству времени приложения не могут его использовать.
O>ну вот то есть совсем нет никакой разницы в читабельности обоих вариантов? O>У меня на прошлой работе как то контора купила старпатчик у которых в проекте были пятиэтажные нэймспейсы, такая себе либа-хрущевка. Вероятно те стартаперы со временем пробрались в С++ комитет.
Так заняты уже std::less, std::greater и std::equal. И имеют совсем другую семантику. Для компактности записи полно всяких средств: алиасы типов и пространств имен, а также using declarations (просто using std::strong_ordering). От того, что ты напишешь дополнительное объявление, твой код никак не проиграет, а только выиграет. Делая такие объявления, ты чётче очерчиваешь границы между "что" и "как".
Я уже молчу о том, что этот оператор вообще должен реализоваться в одну строчку при нормальном дизайне:
auto Foo::operator <=>(const Foo &other) const { return name <=> other.name; }
--
Справедливость выше закона. А человечность выше справедливости.
Слегка калечно (вообще именно в таких деталях система импорта Python с его import foo as bar или from moo import foo as bar — самая прямая и удобная), но работает же.
N>namespace sso { using namespace std::strong_ordering; }
У такого подхода есть преимучества против namespace alias (кроме совместимости со старыми компиляторами, в которых всё равно нет никаких ордерингов)?
Здравствуйте, netch80, Вы писали:
O>> if (r != 0) { O>> return (r < 0) ? std::strong_ordering::less : std::strong_ordering::greater; O>> } O>> return std::strong_ordering::equal;
N>namespace sso { using namespace std::strong_ordering; } N>return (r < 0) ? sso::less : sso::greater;
N>Слегка калечно (вообще именно в таких деталях система импорта Python с его import foo as bar или from moo import foo as bar — самая прямая и удобная), но работает же.
Во-первых, std::strong ordering — это класс, а не пространство имен. Поэтому просто: using sso = std::strong_ordering.
А если бы и было пространство имен, всё равно не стоило так извращаться. Алиасы для пространств имен тоже можно использовать: namespace fs = std::filesystem;
Ну и в-третьих, using-директивы (aka using namespace) нужно использовать очень осторожно. В идеале не использовать вообще. Ибо всё это бомбы отложенного действия.
--
Справедливость выше закона. А человечность выше справедливости.
C>Не понимаю, зачем эти std::strong_ordering::less хоть где-то явно использовать?
Так это был демонстрационный пример на использование слов из strong_ordering, а не на алгоритмическую часть.
Представьте себе, что вам надо написать сравнение строк, или номеров версий, которые несколько чисел через точку, или что-то ещё столь же иерархическое. Да, два символа или отдельных номера вы сравните через <=>, но тут же придётся делать условие типа return if rc != std::strong_ordering::equal, а если equal, то идти к следующему пункту.
Есть и более хитрые случаи.
Здравствуйте, rg45, Вы писали:
R>А если бы и было пространство имен, всё равно не стоило так извращаться. Алиасы для пространств имен тоже можно использовать: namespace fs = std::filesystem;
OK, спасибо. Уже успел забыть про них.
R>Ну и в-третьих, using-директивы (aka using namespace) нужно использовать очень осторожно. В идеале не использовать вообще. Ибо всё это бомбы отложенного действия.
В крошечном контролируемом контексте не должно быть страшно. Хотя тоже обидно, да — не могут не заложить диверсию даже в такой детали...
Здравствуйте, serg_joker, Вы писали:
N>>namespace sso { using namespace std::strong_ordering; } _>У такого подхода есть преимучества против namespace alias (кроме совместимости со старыми компиляторами, в которых всё равно нет никаких ордерингов)?
Есть преимущество: про него легче прочитать тому, кто прочно забыл детали, но помнит, что сходить на cppreference.com по слову using должно что-то подсказать
Здравствуйте, ononim, Вы писали:
O>Ватафак? Что за словоблудие? Я считаю комьюнити должно найти сильно разговорчивых членов комитета и расстрелять их. Ведь болтун — находка для шпиона. В данном случае — для раста.
Здравствуйте, netch80, Вы писали:
N>"duration не нужен" — это, как говорят автомобилисты, до первого столба, когда у тебя вдруг где-то образуется 4050 год потому, что неправильно применены объекты на сложение
Отладка таких ситуаций занимает меньше времени, чем выгугливание документации
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, netch80, Вы писали:
N>Стандартизация того, что корзины 1) есть, 2) их только один набор — очень жёстко зажимает реализацию до closed addressing hash map с рывочной пересборкой. По эффективности получается амортизированное O(1), но не стабильное O(1), как было раньше в Dinkumware и вслед Microsoft STL. А это значит, что критичные к постоянству времени приложения не могут его использовать.
А как в хеш-мапе может быть стабильное O(1)? Вот не повезло и хеши совпали — и что?
А STLьную мапу ограничивает в первую очередь требование стабильности указателей на элементы — всё, dense_map пролетает, примет аллокация на каждый элемент
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, netch80, Вы писали:
N>Представьте себе, что вам надо написать сравнение строк, или номеров версий, которые несколько чисел через точку, или что-то ещё столь же иерархическое. Да, два символа или отдельных номера вы сравните через <=>, но тут же придётся делать условие типа return if rc != std::strong_ordering::equal, а если equal, то идти к следующему пункту. N>Есть и более хитрые случаи.
Разработчики дизайна three-way comparison оказались чрезвычайно коварны и расшилири операции сравнения объектов класса std::strong_ordering, разрешив сравнение с ЛИТЕРАЛЬНЫМ нулём! Таким образом, выражение rc != std::strong_ordering::equal эквивалентно rc != 0. Допустимы выражения типа a <=> b < 0, a <=> b >= 0, etc. Похоже, им и самим не очень нравилось выписывать эти длинные имена
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, ononim, Вы писали:
o> N>"duration не нужен" — это, как говорят автомобилисты, до первого столба, когда у тебя вдруг где-то образуется 4050 год потому, что неправильно применены объекты на сложение, или 1 год вдруг преобразовался к юлианскому календарю и сократился на 10 дней потому, что вычитание. o> duration как самостоятельный объект — ок (хотя название конечно опять же — period было бы читабельнее и писабельнее), а вот duration в качестве скоупа для seconds — лишнее.
duration и period — разные сущности.
duration — это продолжительность чего-либо в тиках часов. Это как-бы физические тики часов между двумя моментами времени. И считается что в дне всегда 24 часа, в годе усреднённое кол-во дней и т.п.
period — это календарная разница по дням/месяцам/годам и может зависеть от таймзоны, календарных правил.
Здравствуйте, T4r4sB, Вы писали:
N>>Стандартизация того, что корзины 1) есть, 2) их только один набор — очень жёстко зажимает реализацию до closed addressing hash map с рывочной пересборкой. По эффективности получается амортизированное O(1), но не стабильное O(1), как было раньше в Dinkumware и вслед Microsoft STL. А это значит, что критичные к постоянству времени приложения не могут его использовать.
TB>А как в хеш-мапе может быть стабильное O(1)? Вот не повезло и хеши совпали — и что?
Разумеется, всё работает в предположении, что на один хэш приходится не более K элементов, где K — константа, ограниченная задачей. Иначе хэш-мапа вообще не может быть полезной, и надо переходить к чему-то другому — например, мапе на дереве (собственно std::map в C++). Извините, абсолютных чудес не бывает. (Кстати, в Java начиная с 8-й защита против таких перекосов: если у корзины более 8 элементов, она преобразуется в маленький самопальный TreeMap. Вместо O(N) худшего случая получаем в результате O(log N).)
Я же говорил о другом. Если в процессе операции, которая имеет право делать создание новых корзин и перераспределение по ним (для unordered_map это позволено для insert с родственными, но не для erase), движок подсчитает, что надо перераспределить по другому составу корзин, это и есть O(N) для данной операции, а если нет, O(1). То есть время одного insert (emplace, etc.) может оказаться непредсказуемо высоким. Как говорил герой фильма, "стабильности нет". Сейчас в библиотеках для GCC и Clang именно так, они грубым рывком пересчитывают и перемещают всех.
А вот названные старые реализации позволяли иметь одновременно два набора корзин. Например, идёт активное заполнение, первый на 1024 корзин, второй на 2048. Каждый insert вставляет новый элемент (ключ+значение) в новый набор (который на 2048) и заодно перемещает два элемента из старого в новый. Действие по перегруппировке между корзинами, таким образом, аккуратно размазывается на разные операции. Или при удалении элементов, наоборот, новый набор тоньше, действие по сути то же самое.
В принципе, можно подобное накостылять (именно что накостылять) и в рамках требований C++11. Возвращал bucket_count() число 1024. Решили создать новый набор, оп — уже 3072, старый плюс новый. Закончился перенос из старого — старый удалили — 2048. Только сжатие назад неудобно. На erase() оно запрещено. Значит, если после всех erase() будет один insert(), на него надо навесить дополнительно сколько-то перемещений (минимум 2, лучше 3) из опустыненного широкого набора в новый узкий. Вроде я никаких подводных камней не заметил, но кто знает.
TB>А STLьную мапу ограничивает в первую очередь требование стабильности указателей на элементы — всё, dense_map пролетает, примет аллокация на каждый элемент
Ну если в большинстве корзин 0 или 1 элемент (GCC поддерживает по умолчанию load factor, равный 1) — это совмещено с самими корзинами. Можно оставлять место и на ещё один, больше — вряд ли, надо рисовать списки (или деревья, как выше).
Здравствуйте, netch80, Вы писали:
N>Ну если в большинстве корзин 0 или 1 элемент (GCC поддерживает по умолчанию load factor, равный 1) — это совмещено с самими корзинами.
Каждая корзина — в своей области памяти. Все равно по аллокации на элемент
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, netch80, Вы писали:
N>>Ну если в большинстве корзин 0 или 1 элемент (GCC поддерживает по умолчанию load factor, равный 1) — это совмещено с самими корзинами.
TB>Каждая корзина — в своей области памяти. Все равно по аллокации на элемент
Почему ты так думаешь?
Смотрю на реализацию GCC. Есть массив корзин, динамически аллоцируемый целым куском. Каждый элемент корзины — структура из значения и указателя на следующий такой же элемент. Для простоты демонстрации это выглядит где-то так:
[c++]
struct bucket_element {
Value value; // по факту просто область памяти, если !present
bool present;
struct bucket_element *next;
};
struct hash_map {
struct bucket_element *bucket_array;
size_t bucket_array_size;
};
[/c++]
Массив выделяется куском.
Дополнительные аллокации bucket_element происходят только там, где в корзине более одного элемента. Первая в каждой корзине делается по месту.
Здравствуйте, netch80, Вы писали:
N>Здравствуйте, T4r4sB, Вы писали:
TB>>Здравствуйте, netch80, Вы писали:
N>>>Ну если в большинстве корзин 0 или 1 элемент (GCC поддерживает по умолчанию load factor, равный 1) — это совмещено с самими корзинами.
TB>>Каждая корзина — в своей области памяти. Все равно по аллокации на элемент
N>Почему ты так думаешь?
Пртому что указатели на элементы сохраняются при перестроении
N>Смотрю на реализацию GCC. Есть массив корзин, динамически аллоцируемый целым куском. Каждый элемент корзины — структура из значения и указателя на следующий такой же элемент. Для простоты демонстрации это выглядит где-то так:
N>[c++] N>struct bucket_element { N> Value value; // по факту просто область памяти, если !present N> bool present; N> struct bucket_element *next;
А еще там есть using __bucket_type=__node_base*
N>Массив выделяется куском.
Массив указателей на ноды
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте