-
Для пробы делаю такой код:type TStringString = record
strLeft: AnsiString;
strRight: AnsiString;
end;
......
var
myList: TList<TStringString>;
begin
myList := TList<TStringString>.Create;
... заполняю myList ...
myList.Sort;
И всё компилируется и при запуске не валится.
Вопрос: как так?? как же оно тогда сортирует?
В то же время вот такой код не компилируется, "определён не применим к данному типу", что логично:
var
strStrRec: TStringString;
strStrRec_1: TStringString;
begin
if strStrRec_1 > strStrRec then
.....
И еще вопрос:
Можно ли как-то в такой контейнер сложить тип, в самом типе определить операцию сравнения и чтобы она использовалась для сортировки? (ну т.е. в с++ стиле, дада, вы меня поняли).
Идти через TComparer мне не понравилось тем, что там в итоге вызывается Compare, который виртуальный (ну я не вижу другого варианта), т.е. при сортировке/поиске для каждого сравнения будет вызываться виртуальный метод что, конечно, крайне грустно для производительности на моих объёмах. Да и просто обидно. -
*"определён не применим к данному типу",
извиняюсь, "оператор не применим к данному типу", -
TComparer в самом деле содержит виртуальную функцию, этого бы не хотелось.
Чтобы этого избежать - надо сделать что-то, что реализовывало бы напрямую IComparer<TStringString>
Люди, это ж как-то просто явно сделать, только не соображу как синтаксически.
Подскажите, а? плиз -
KSergey © (30.05.18 19:49) [3]> Идти через TComparer мне не понравилось тем, что там в итоге
> вызывается Compare, который виртуальный (ну я не вижу другого
> варианта), т.е. при сортировке/поиске для каждого сравнения
> будет вызываться виртуальный метод что, конечно, крайне
> грустно для производительности на моих объёмах
Ok, на вопрос "как не использовать" я нашел ответ: через TDelegatedComparer
https://stackoverflow.com/questions/8051327/how-can-i-search-a-generic-tlist-for-a-record-with-a-certain-field-value?lq=1 -
У меня остался единственный вопрос (т.к. книжку Тенцера я так и не осилил, не смог осознать её, потому он меня совершенно справедливо и не взял в "Катрен" много лет тому)
Вопрос: если где-то встречается слово interface - это гарантированно означает что по итогу в реализации обязательно окажется виртуальная функция? или всё же нет? -
Друзья мои
Я честно почитал про все эти дженерики.
Однако ответа вот на этот вопрос так и не нашел. Быть может кто-то знает и подскажет?
Вопрос: если где-то встречается слово interface - это гарантированно означает что по итогу в реализации обязательно окажется виртуальная функция? или всё же нет? -
Dimka Maslov © (07.06.18 22:38) [6]
> это гарантированно означает что по итогу в реализации обязательно
> окажется виртуальная функция
Гарантировано. А чем плоха виртуальная функция для производительности? -
> Dimka Maslov © (07.06.18 22:38) [6]
> А чем плоха виртуальная функция для производительности?
>
Пойду еще раз перечитаю как технически реализованы виртуальные функции
Может я в самом деле перемудриваю. -
Dimka Maslov © (18.06.18 16:34) [8]
> как технически реализованы виртуальные функции
Совсем не так, как "динамические". Вот те действительно могут вызвать замедление на большом количестве вызовов.