Можно каждую трансформацию данных начинать с церемонии for i := 0 to list.Count-1 do begin bla-bla end; А можно написать только то, что нужно для задачи и пойти решать следующие задачи, не распыляясь на итерации по спискам.
Как думаете, откуда уши растут у шарпового Span и сишного ranges? Я думаю, это из серверной разработки, когда для обработки http-заголовков решили не сплиттить входящий запрос на кусочки, а придумали Span-ы и string_view. А дальше выделяем кусок Content-Length: 123 и передаём в функции, которые раньше принимали строки (с минимальным рефакторингом кода), и всё по-прежнему красиво, выглядит как будто мы пакет побили на строки и разбираемся с ними отдельно, а копирований и аллокаций - нет.
Решение с TArraySlice не позволит провернуть такой трюк, несите другое.
Решение в стиле plain old C, рушит безопасность по выходу за границы области.
TEnumerable<T> - абстракция, которая позволяет создать последовательность, даже не из последовательных данных
Как раз, удобная абстракция для наложения произвольных фильтров и произвольных поисков. Зачем требовать List<T>
И вот TList<T> имеет возможность задать предикат для поиска и сортировки
Это сильно просаживает абстракции, потому что не даёт способа последовательно наложить фильтры на коллекции, а потом выбрать элементы, избегая создания промежуточных списков.
В современных языках такие цепочки трансформаций оптимизируются в compile-time, поэтому хорошо, когда оно встроено в std, а не написано на коленке поверх стандартных TEnumerable, например через yield.
Я думаю, Delphi отстаёт от c++, который отстаёт от C#. Когда-нибудь каждый догонит текущую ситуацию, а фаворит гонки продвинется ещё дальше.
Ну например, можно ли взять кусок массива с 5-го элемента по 30-й и передать как абстрактный кусок памяти без копирования (получатель не должен знать, что лежит уровнем ниже - массив/список/вектор).
Или вот я вижу некий абстрактный TEnumerable<T>. Есть ли метод, ищущий первый элемент, удовлетворяющий переданному предикату?
Хватило, если бы блага распределялись более равномерно. А так всё логично - рептилоиды устроили трансформацию общества, чтобы ещё больше усилить эксплуатацию. "Дожать", на языке эффективного менеджмента.
В std очень много обобщённого программирования. Абстракные алгоритмы на любых контейнерах, в том числе не известных std, всякие абстракции-обёртки над итераторами, диапазонами (views, ranges, string_view). Одни только функции с датой/временем/интервалами тянут на целую книгу.
Alt+Ctrl+Ins копирует полный путь к папке под курсором, потом переходим на панель источник, F6, Shift+Ins, Enter. Можно намакросить, если надо очень часто.
Тут bla-bla это суть, а мне нужно избавиться от повторяющихся for
Можно каждую трансформацию данных начинать с церемонии
for i := 0 to list.Count-1 do begin bla-bla end;
А можно написать только то, что нужно для задачи и пойти решать следующие задачи, не распыляясь на итерации по спискам.
Тогда ткните в документацию embarcadero, какой метод надо использовать.
Сравнивалась реализация с bitstring? Тогда может, дело в нагрузке на память?
Я на дельфи писал вложенные циклы и ничего другого мне не требовалось, потому что ничего другого язык не предоставлял.
Много теории. А на практике, однострочником можно ли перелить из одного TList в другой TList только чётные элементы?
Конкретно этот код - копирует, потому что переменная ArrSlice - не ссылочного типа, а тип-значение.
Список языков на международных ACM ICPC:
не вижу тут Паскаль.
А кстати, в 90-х был )))
И что мешает сделать ему
function Filter(source: TEnumerable<T>; predicate: TFunction<T, bool>): TEnumerable<T>;
в стандартной библиотеке?
А слона то я и не заметил, тут нужен PArraySlice ))
Как думаете, откуда уши растут у шарпового Span и сишного ranges?
Я думаю, это из серверной разработки, когда для обработки http-заголовков решили не сплиттить входящий запрос на кусочки, а придумали Span-ы и string_view. А дальше выделяем кусок
Content-Length: 123
и передаём в функции, которые раньше принимали строки (с минимальным рефакторингом кода), и всё по-прежнему красиво, выглядит как будто мы пакет побили на строки и разбираемся с ними отдельно, а копирований и аллокаций - нет.Решение с TArraySlice не позволит провернуть такой трюк, несите другое.
glhf...
Решение в стиле plain old C, рушит безопасность по выходу за границы области.
Как раз, удобная абстракция для наложения произвольных фильтров и произвольных поисков. Зачем требовать
List<T>
Это сильно просаживает абстракции, потому что не даёт способа последовательно наложить фильтры на коллекции, а потом выбрать элементы, избегая создания промежуточных списков.
В современных языках такие цепочки трансформаций оптимизируются в compile-time, поэтому хорошо, когда оно встроено в std, а не написано на коленке поверх стандартных TEnumerable, например через yield.
Я думаю, Delphi отстаёт от c++, который отстаёт от C#.
Когда-нибудь каждый догонит текущую ситуацию, а фаворит гонки продвинется ещё дальше.
Ну например, можно ли взять кусок массива с 5-го элемента по 30-й и передать как абстрактный кусок памяти без копирования (получатель не должен знать, что лежит уровнем ниже - массив/список/вектор).
Или вот я вижу некий абстрактный
TEnumerable<T>
. Есть ли метод, ищущий первый элемент, удовлетворяющий переданному предикату?Хватило, если бы блага распределялись более равномерно.
А так всё логично - рептилоиды устроили трансформацию общества, чтобы ещё больше усилить эксплуатацию. "Дожать", на языке эффективного менеджмента.
В std очень много обобщённого программирования.
Абстракные алгоритмы на любых контейнерах, в том числе не известных std, всякие абстракции-обёртки над итераторами, диапазонами (views, ranges, string_view). Одни только функции с датой/временем/интервалами тянут на целую книгу.
Можно тут посмотреть оглавление
https://eel.is/c++draft/
В Delphi именно generics, как в C#/java, а не templates, как в C++
Различие довольно существенное.
Для C# есть Mono.
Alt+Ctrl+Ins копирует полный путь к папке под курсором, потом переходим на панель источник, F6, Shift+Ins, Enter. Можно намакросить, если надо очень часто.
FARdroid использую в связке с PortaDev
Первый реализует протокол ADB, который включен довольно редко, а второй - более обывательский протокол MTP.
Ещё один пример, когда на плаг-ринге лежит версия 2014 года, а на форуме обновление 2023.
На что я отвечаю, что в распределённой системе расходов будет больше, т.к. добавляются расходы на управление процессом.