Step 3 (S-11541)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/564/step/3

Step 3 (S-11541) 1.png

[00:00 - 00:17] другой пример использования шаблонов это реализации алгоритмов предположим что можно ожидать некоторого горит горит на сортировки массивов таким образом чтобы он работал в максиме разных типов это довольно легко сделать при помощи шаблонов однако давайте сначала посмотрим как это сделать без использования шаблонов


[00:17 - 00:33] если будем реализовать алгоритм сортировки на языке c то это можно сделать аналогично функционалу сорт и стандартной библиотеке языка c данной функции реализует алгоритм быстрой сортировки особенность данной функции в том что она работает с массивами


[00:33 - 00:50] как достигать достигается за счет того что массив функции передаются через указатель на вот то есть через данной карте можно передать любой массив однако при этом мы потеряем информацию о типе элемента который хранится в данном месте


[00:50 - 01:07] поэтому кроме количество элементов в массиве фундук надо передать и размер элемента массива в байтах то есть надо понимать что внутри этой функции массив которую опирается притворяется 8


[01:07 - 01:25] для того чтобы понимать где заканчивается одновременно начинается другой то нужно знать сколько байт занимает 1 элемент массива и за это отвечает как раз 3 аргумент функции кроме этого для того чтобы отсортировать или нет она массивная нужно сейчас их сравнивать


[01:25 - 01:40] некую информацию о типе нас нет поэтому как сравнивать мы не знаем нам нужно придумать некоторый механизм который позволил бы передать внутрь функции информации о том как сравнивать 2 элемент массива для чего используется 4 аргумент функции курсор


[01:40 - 01:56] в качестве 4 аргументов в не передаются указатель на функцию которая используется для сравнения документы то есть если внутри алгоритма сортировки на можно сравнить 2 элемента массива то мы берем вычисляем


[01:56 - 02:12] указатели на телефон и передает их в соответствующие фонды так как указатель на функцию мы не проходили принципе эта тема лежит за пределами данного курса то я просто указал в комментариях ну чтобы никого не пугать


[02:12 - 02:28] соответствующее исторической конструкции но давайте разберемся как работа дана функция смысле функцию курсор идеологически ей передается указатель на некоторый вася она знает сколько примерно данном массиве на знает сколько


[02:28 - 02:43] байт занимает каждый конкретный то есть например если нужно вычислить где начинается примет на себя с номером 5 я не относилась номер 9 может идти ну то есть он просто вычислить прибавив к


[02:43 - 03:01] следователь начал носила соответствующее количество байт там соответствуют 5 элементов двигателя после то есть она хочет сравнить примите меры 5 примеров номер 9 она вычисляет их адреса и передает функцию которая получила в качестве 4 аргумент


[03:01 - 03:16] ну и функция принимает эти адреса и возвращать это значение например что 9 элемент меньше чем 5 в таком случае внутри функции которые термин надо поменять местами как это делать


[03:16 - 03:34] это делать правильно то есть просто побайтно меняем их местами данный подход принципе работает для любых встроенных типов и для любых простых типов то есть для тех типов которые можно копировать побайтово для объектов дан подход может не работать то есть


[03:34 - 03:50] копирование объектов без вызова конструктора деструктора это неопределенное поведение и такие объекты копировать или сортировать при помощи функции курсор нельзя то есть проблема функции курсор заключается в том что


[03:50 - 04:09] дана функция не типа безопасно и не работает с пользовательским классом что делать если мы хотим сортировать в том числе но для этого нужно использовать средства языка c а языка c + + посмотрим как написать функцию сортировки средствами языка c + +


[04:09 - 04:27] если делать это средствами языка c + + без использования объекта например шаблонов то нам придется написать по функции сортировки для каждого типа есть написано для встроенных типов но том числе и для политических типов нам тоже будет нужно отдельно реализовать сортировку


[04:27 - 04:42] если мы разрешим использования объектной но программирования то в данном случае можно применить подход аналогичен тому который мы использовали на прядущем слайде то есть выделить некоторой интерфейса


[04:42 - 05:01] в данном случае i comparable то есть интерфейс который должны будут поддержать все класса которые можно сравнивать и дальше мы определим функцию которая будет сортировать массив указателей на объекты поддерживающие интерфейс ide compatible


[05:01 - 05:15] ну данный подход в принципе работающий но он плох тем что надо работать со всеми объектами моего полиморфной то есть через указатели они должны поддерживать интерфейс и


[05:15 - 05:34] да очень много накладных расходов + к тому если мы захотим при помощи данной функцией сортировать а встроенный типа то нам нужно будет написать класса который оборачивается встроена типа так же как мы это делали но продолжал писать то есть данный подход в принципе хорош тем что нам потребуется только 1 функция сортировки есть нам


[05:34 - 05:50] потребуется только 1 раз реализовать алгоритм сортировки однако накладные расходы за счет использования объектной активно проверь может быть довольно большие и для стройности это очень расточительно ну и если нам разрешают использовать шаблоны то


[05:50 - 06:06] достаточно написать 1 шаблонную функцию функцию сорт который будет принимать массив типа так где там шаблонный параметр и реализовать ее таким образом


[06:06 - 06:23] чтобы внутри эта функция использовался например оператор меньше так останется будет работать со всеми типами для которых определен оператор меч как видите реализации при помощи шаблонов она не только наиболее простая


[06:23 - 06:39] но она также будет наиболее эффективной нам не придется описывать каким то образом оборачивать классы описывать как надо их сравнивать и так далее мы просто знаю что для объектов есть оператор меньше мы сможем их сравнивать


[06:39 - 06:58] шаблоны функция имеет несколько отличий от шаблонов классов 1 из этих отличие это то что шаблоны функций нет параметров по умолчанию как говорю шаблоны классов мы говорим что там можно увидеть много шаблонных параметров но некоторые ним задать значение по умолчанию шаблонных функций


[06:58 - 07:16] нет значения шаблоны параметров по умолчанию если мы хотим чтобы некоторые шаблоны параметра погулять по умолчанию можно просто придерживаться то есть для шаблонных функций то есть вы перегрузка в отличие от шаблонов класс этом этим хотим


[07:16 - 07:26] чтобы эта функция не меньшее количество шаблонных параметров можно просто перегрузить ее и в принципе в реализации 1 функции вызвать другое все это вполне возможно