Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

TList<TMyType> и Sort - почему работает без объявления сравнения


KSergey ©   (30.05.18 15:04

Для пробы делаю такой код:

   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, который виртуальный (ну я не вижу другого варианта), т.е. при сортировке/поиске для каждого сравнения будет вызываться виртуальный метод что, конечно, крайне грустно для производительности на моих объёмах. Да и просто обидно.


KSergey ©   (30.05.18 15:05[1]

*"определён не применим к данному типу",

извиняюсь, "оператор не применим к данному типу",


KSergey ©   (30.05.18 16:56[2]

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


KSergey ©   (30.05.18 19:51[4]

У меня остался единственный вопрос (т.к. книжку Тенцера я так и не осилил, не смог осознать её, потому он меня совершенно справедливо и не взял в "Катрен" много лет тому)

Вопрос: если где-то встречается слово interface - это гарантированно означает что по итогу в реализации обязательно окажется виртуальная функция? или всё же нет?


KSergey ©   (06.06.18 11:49[5]

Друзья мои
Я честно почитал про все эти дженерики.
Однако ответа вот на этот вопрос так и не нашел. Быть может кто-то знает и подскажет?

Вопрос: если где-то встречается слово interface - это гарантированно означает что по итогу в реализации обязательно окажется виртуальная функция? или всё же нет?


Dimka Maslov ©   (07.06.18 22:38[6]


> это гарантированно означает что по итогу в реализации обязательно
> окажется виртуальная функция


Гарантировано. А чем плоха виртуальная функция для производительности?


KSergey ©   (17.06.18 12:47[7]

> Dimka Maslov ©   (07.06.18 22:38) [6]
> А чем плоха виртуальная функция для производительности?
>

Пойду еще раз перечитаю как технически реализованы виртуальные функции
Может я в самом деле перемудриваю.


Dimka Maslov ©   (18.06.18 16:34[8]


> как технически реализованы виртуальные функции


Совсем не так, как "динамические". Вот те действительно могут вызвать замедление на большом количестве вызовов.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо