Конференция "Начинающим" » TList<TMyType> и Sort - почему работает без объявления сравнения
 
  • KSergey © (30.05.18 15:04) [0]
    Для пробы делаю такой код:

       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]

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


    Совсем не так, как "динамические". Вот те действительно могут вызвать замедление на большом количестве вызовов.
 
Конференция "Начинающим" » TList<TMyType> и Sort - почему работает без объявления сравнения
Есть новые Нет новых   [118478   +40][b:0][p:0.001]