Собеседование Middle C++

Подготовка к собеседованию на C/C++ Developer

Транскрипция видео:

  • так Всем привет Вы на канале эмбуш дракон Сегодня у нас тренировочная собеседование на позицию Junior c++ девелопер и с нами на связи Александр Всем привет да привет Спасибо что пришел и давай начинать вот ну что ж по стандарту Расскажи пожалуйста немного о своем опыте где учился где работал что знаешь чего не знаешь Расскажи где-то 16 лет поначалу это была Java но потом я поступил в университет и тут уже были плюс вот и как-то они мне больше понравились не знаю как-то по душе были вот с тех пор я джаву забросил и вот

    00:00:00 - 00:01:21

  • собственно занимался только плюсами вот сейчас я снова учусь университете в магистратуре на первом курсе вот успел поработать с такими как Open TV с библиотекой для компьютерного зрения он успел поработать и вот сейчас чуть-чуть начал тыкать Вот как я этого слова не слышал что это такое Что это за технология grpc Это гугловская технология для в общем-то общения сервера и клиента они там с помощью протобаффов передают сообщение в общем это такой достаточно простой фреймворк который применяется очень много где типа современный

    00:00:43 - 00:02:18

  • развивается и поддерживается Гуглом [музыка] есть для многих языков в том числе и для плюсов ясно хорошо спасибо смотри какой-то коммерческий опыт у тебя есть коммерческий Опыт есть я поработал в компании занимается компьютерным зрением там как раз у меня были сейчас я уже немного другой области работаю там тоже на плюсах понятно То есть еще опыт работы с базами данных есть то чуть хорошо Хорошо Так ну что же давай тогда переходить к технической части к нашему первому вопросу и сразу с места в карьер

    00:01:31 - 00:03:06

  • в общем скидываю тебе в чат ссылочку открывай пожалуйста и включение пожалуйста демонстрации экрана Угу так видно сейчас я увижу проверю Да вижу А может немного подзумить пожалуйста я думаю можно просто колесико и мышкой вот отлично Слушай но задача такая тут не то что мне важно прямо как Что конкретно ты напишешь писать естественно приветствуется Если как бы знаешь мне больше Интересно в общем поймешь ли ты и так далее как ты будешь это все дело понимать В общем задача состоит следующем на вход у нас

    00:02:26 - 00:03:48

  • поступает как бы string Да есть передается также чаровский символ соответственно нужно все вхождения данного символа в строке экранировать и экранированием назовем пометить его обратным слышу то есть мы встречаем Чар и как бы ну вот как у нас например есть также Вот этот встречный нами символ должен быть превращен в слэш символ и мы далее должны вернуть эту строку вот ну уже как бы новую строку Да потому что константная соответственно какой-то новый результат работает и функции вернем давай Ну в общем рассказывай как

    00:03:24 - 00:04:58

  • как будешь решать Ну я наверное Хочу завести два итератора один на текущую позицию один на предыдущий вот будем Ну вдвоем и перемещать если итератор на текущей позиции встретил нам нужный Чар мы добавим Ну добавим символ слэш с помощью предыдущего императора Хорошо давай попробуем написать как [музыка] Ты поменял размер табов экспериментировал Да и наверное на четверку лучше Я так понимаю маг у тебя Да так пусть нас будет это один это будет который предыдущий Давайте [музыка] и у нас будет текущий оператор

    00:04:11 - 00:06:22

  • [музыка] хорошо что будет дальше Теперь нужно проверить случай что если Давайте даже до начала проверим что если равно C Хорошо тогда стр стр равно слэш плюс будет чтобы хорошо Но получается то есть ты проверил что у тебя первый символ Да соответственно ты если первый символ то ты начала как бы сразу вставляешь Да ну хорошо Пусть пока будет так смотри Но если уже прямо в проверке уходить дата конечно не хватает еще одной проверочки тут что-то табляться как-то Ну да что-то поломалась Ну ладно я думаю мы это

    00:05:21 - 00:07:05

  • переживем Вот это в общем смотрите получается твои этапы работают нормально автоматически там и которые она раскидывает работают плохо так Ну я так понимаю что раз ничего нет пустую Ну я бы конечно для наглядности вернул что можно такое наглядно хорошо что еще нужно можно вернуть Вообще я думаю такое Возвращение Не сработает потому что оно воспримет это как вызов функции То есть если ты так хочешь вернуть то Тебе не помешало бы фигурные скобки поставить можно так Да можно так но я вообще вел к тому что можно и просто пустые фигурные

    00:06:42 - 00:08:10

  • скобки вернулись но как бы не сильно но вот string было бы скорее всего была бы ошибка с круглыми скобками хорошо Хорошо давай Окей мы закрыли значит Корнер кей закрыли пустую строку Давай переходить к решению в цикле к нашему алгоритму Да теперь у нас так Ну допустим нас вот этот кейс отработал получается превь сейчас указывает на Ну второй элемент уже То есть первый элемент слэш и второй элемент это Ну который после слэша вот я бы наверное для удобства вынес бы вот эту штуку Сейчас объясню почему потому что

    00:07:32 - 00:09:09

  • Потому что если у нас здесь встретился такой случай то нам нужно и как увеличить чтобы они были на чтобы там все было согласовано Ну хорошо Будут располагаться из-за не перебью то есть что у нас здесь произойдет У нас например Карен указывает на суше все ли нормально будет с Карен после того как ты сделаешь ставку Все ли будет хорошо скажем там думаю да потому что он же указывает на конкретный символ вот а кстати Ну да если честно сдвинется и он может поломаться в общем я тебя давай уже как бы прервём потому

    00:08:29 - 00:10:03

  • что пошел Немного не в ту сторону давай сразу более какой-то оптимальную сторону вот просто Смотри да Ну предположим мы не думаем сейчас про вот эти Корнер кейсы Да вот поэтому всё не думаем Да например ты вот пишешь свой алгоритм и идёшь Ну так я так понимаю вот короче Расскажи на словах как ты это видишь у себя в голове вот ты идёшь и как ты куда вставляешь как бы что будет происходить Ну просто идут по строчке если вижу символ ц перед ним вставляешь как бы ну всё просто получается Ну да я думаю что можно в данную строку

    00:09:17 - 00:10:26

  • можно завести вторую Если как бы память не жалко вообще смотрю данную строку мы не можем этого сделать потому что данная строка передается Константа заводить другую строку в чем проблема например Хорошо мы завели другую строку Да мы в нее сразу все скопировали мы пошли по ней встретили вставили То есть в принципе все будет работать Даже для этого какие-то отдельные костыли не нужны ну то есть можно просто циклом пройти и без оператора перед ним вставлять и немного переиграть с индексами всё как бы будет работать да

    00:09:54 - 00:11:01

  • но смотри В чём тут как бы проблема то есть предположим вот строка у тебя Да она например что если это будет все символы C Да и что если это будет 1.000 символов в C то есть тогда вот что будет происходить как бы на ставке в неё строку Вот скажи мне пожалуйста например вот ты в строку будешь вставлять её в середину условно да интересен Вот какие у тебя побочные эффекты у меня будет куча копирования да Ну еще И еще И что будет происходить если мы будем превышать там копасить это будет релокация памяти но и перемещение

    00:10:27 - 00:11:49

  • элементов в Новую память Ну хорошо Да это как бы все нам не нужно Да это все лишнее вот мы хотим от этого уйти да вот как бы как мы тогда можем попробовать переделать свой алгоритм Да чтобы это все заработало скажем так можем завести вторую строчку И тогда все гораздо проще будет Ну хорошо давай давай уберем наши корни кейсы они нам по большому счету нам понадобится только наверно первый самый он выглядит адекватно собеседованиях других каких-то рекомендую тоже крайне как бы Корнер кейсы закрывать это

    00:11:08 - 00:12:24

  • всем всегда нравится вот Хорошо давай мы заводим другую строку Окей все И теперь по нашей строке [музыка] тогда анса плюс равно вот и плюс одно отлично отлично Мне нравится но еще не все что еще можем улучшить что какой Мы из того что я писал то что мы обсудили Какую мы часть не закрыли Ну у нас может быть переполнение вот этих Ну вот это буфера который нам выделен Изначально и будет выделение нового и копирование да то есть будет лишний перевыделение хорошо Как мы можем этого избежать Мы точно знаем что длина нашей будущей

    00:11:46 - 00:13:30

  • строки она будет меньше или равно чем STR сайт чем 2 на это да то есть мы можем Я не знаю если у станка такой конструктор где задаются размер как минимум есть у стринга если правильно помню функция резерв которую можно вызвать сразу кусок памяти то есть здесь верном направлении мыслишь 2 умножить на СТС не в принципе нравится это закроет как бы случае но можно также немного типа пожертвовать временем добавить один проход и один раз пройтись посчитать и соответственно 2 умножить на сайте Мне тоже нравится

    00:13:20 - 00:14:51

  • Вполне себе хорошо Мне понравилось в целом Давай переходить следующему вопросу наверное демонстрация экрана пока можешь убрать так хорошо Смотри Вот у нас получается вот ты как раз имел дело сжавой ты упомянул Да поэтому проведем немного аналогии Да вот например когда ты имеешь дело с Java или с такими языками как сишарп в принципе по сути класс можно писать спокойно как бы в одном файле Да объявляешь метод тут же его как бы реализуешь в этом плане как бы все работает вот у нас как бы все плюс плюс у нас не так да у нас

    00:14:08 - 00:15:32

  • происходит как бы разделение на два файла на цепи Я думаю для тебя не новости можно про это не спрашивать Вот и смотри мы же хитере можем писать как бы код Да хорошо А почему мы этого не делаем мы это делаем чтобы ну во-первых для какой-то красоты наверное Вот а во-вторых если Ну когда мы подключаем наш хидеры к другим файлам то все что в нем Оно просто как копируется Возможно мы хотим скрыть реализацию там другого файла в нужную сторону пошел да Ну вот именно с тем что копируется вот верно мыслишь

    00:14:55 - 00:16:29

  • раскрыть реализацию в рамках одного проекта это все наши нам без разницы Все могут видеть вот какой вот еще такой Побочный эффект будет работать Ну может перед Ну может наверное так получится что нас будет две функции с одним именем Ой там еще может быть вроде как это влияет на объем чего-то там то ли объектного файла то ли что Да все верно на объем объектного файла это повлияет Да но как бы как любят говорить в институтах в нынешних реалиях машины настолько мощные что это нам все неважно вот а что нам важно короче что вот еще

    00:15:45 - 00:17:24

  • хорошо до объектный файл вот Окей в нужную сторону у нас добавится объектные файлы Точнее ну как сам объектный файл то без разницы скорее результирующий экзешник его размер увеличится из-за сложных объектов Вот Но что вот еще может быть что-то что будет происходить с файлами куда включен с файлами куда header [музыка] даже не знаю Может там буду с ним собеседование было Вот вот что такое единица вот что является единицей трансляции для единицы трансляции это cpv файл хорошо соответственно у нас например 10 PP

    00:16:50 - 00:18:14

  • файлов включен один хитр мы получается поменяли код у нас будет много допустим каких-то функций много реализации одних и тех же естественно будет получается все вставлена в сторону того что само время компиляции у нас всегда будет растягиваться То есть получается что например мы поменяли один как бы нам кажется что и соответственно в рамках больших проектов включается все начнут как бы перебираться такой один из недостатков да Хорошо а когда ну как бы это все это понятно Да мы переносим в ЦПП Все работает Быстро

    00:17:35 - 00:19:08

  • Но в каких ситуациях мы не можем перенести цифр А когда мы вынуждены писать когда мы вынуждены файле код не знаю с таким как даже не встречался прямо с вынужденными ситуациями не то что это вынуждена Это я пожалуй какое-то слишком Такое сильное слово использовал Да но просто есть как бы ситуация когда этого не избежать это необходимость которая диктуется собственно языком Ну может быть когда мы пишем какую-то сторонней библиотеку который будет поставляться с хейдерами из бинарником и там может нам нужен будет какой-нибудь

    00:18:24 - 00:19:40

  • будем подключать если мы будем писать какую-то хитрон ли тогда да тогда конечно нам надо будет всё писать фидеры Ну вот смотри слово шаблон тебе о чем-то говорит Да Ну так вот что будет происходить шаблонами где мы их можем писать шаблоны А ну да Потому что когда компилятор видит шаблон он сразу поставляет туда Тип и просто делает новую копию какого-то допустим метода с конкретным типом получается что вот если у нас не будет поставленного типа то что мы не знаем что компилятор просто не знает как Собственно как

    00:19:06 - 00:20:29

  • выглядит эта функция он не сможет скомпилировать Да да все правильно то есть по сути если мы делаем какое-то распространяемый шаблон Да и то мы будем вынуждены все писать как бы в hider файлах есть конечно обходные пути Но эти обходные пути в основном работают только в рамках твоего проекта как бы то есть всякие юзинги и прочее вот Хорошо Окей в целом двигался верном направлении чуть-чуть не дошли ничего так давай тогда перейдем вот такой вопрос смотри Знакомы ли тебе ключевое слово экстерн экстерн Да знакомо правда сам его не

    00:19:47 - 00:21:19

  • применял Ну насколько знаю его используют как раз таки в hyper-файлах и Это говорит о том что что это какая-то функция или переменная они видны в других или в сторону пошел это тоже скажем так это с этим связано давай немного подумаем про просто экстерн например про какие-то глобальные переменные Вот ты про это что-то знаешь если не знаешь что я просто расскажу как вообще Ну вот если у нас допустим переменные помечены там ключевым словом стати кто не видны только внутри файлы своего ключевое слово нужно для обратной

    00:20:34 - 00:22:06

  • ситуации не совсем так ключевое слово extern говорит нам о том что данная переменная на самом деле не объявляется здесь данная переменная это какая-то глобальная переменная из другого какого-то файла то есть нас например два ЦПП файла в одном там Intex равно 0 А в нашем файле будет extern X соответственно это будет означать что мы используем переменную X глобальную из другого файла Хорошо Окей Смотри вот еще ты начинал говорить про функции Вот ты про экстерн си что ты знаешь естественно не встречался

    00:21:24 - 00:22:38

  • не знаешь Ну тогда надо повторить речь про довольно долго рассказывать поэтому как бы особенно сейчас не будем останавливаться речь про предоставление функции которые будут компилироваться как будто это функции си они си плюс плюс вот Хорошо смотри Давай мы дальше перейдем опять-таки к демонстрации экрана и к решению задачки еще сейчас я ее добавлю сюда хотим Хорошо смотри returnal не обращаем Внимание это просто чтобы у меня компилятор не ругался Когда это все прописывал я написал Итак Да у нас функция которая принимает себя Число

    00:22:02 - 00:23:34

  • как бы самого На отбор с которым будет работать принимает некий индекс и принимает значение гулевская твоя задача в числе Number присвоить значение единицы либо нуля в зависимости от битвы присвоить его биту под номером индекс в числе нам знаком ли ты вообще сбитыми операциями не то чтобы много как-то с ними имел дело Ну давай тогда попробуем подумать в эту сторону и посмотрим как пойдет присвоить единицу Да а присвоить бит Ну который в зависимости от You in32 Так 32 Значит у нас число 8 битная сейчас 32 4 битная

    00:22:58 - 00:24:43

  • Ну это сейчас об этом смотри про ограничение сейчас не будем заморачиваться то есть предположим отталкиваемся от того что индекс приходит Как бы правильно то есть индекс приходит правильный и мы с ним работаем а всякие уинт и прочие это написал только для того чтобы мы не думали о том что там будет со знаком со знаком битом и так далее просто все у нас есть самая обычная двоичное число где у него нули или единицы все индекс индекс от 0 до 31 тут Ну насколько я понимаю раз нас 32-битное число то у него будет 5 знаков да

    00:24:02 - 00:25:18

  • получается 5 цифр допустим вот Ну потому что 2 в 5 это 32 и вот в двоичном представлении нет двоичное представление будет 32 цифра а ой да я предлагаю сделать вид маску просто вот и сделать получается Ну либо логический плюс либо логическое умножение но я не ориентируюсь логических плюсах и логических умножениях Я знаю как бы и собственно да Или Хорошо давай давай начнем битого маска Мне нравится Давай начнем с того что мы сделаем битовую маску [музыка] я не помню Честно как байтовый как двоичные числа здесь

    00:24:42 - 00:26:30

  • обозначать так тебе это и не нужно зачем тебе это тебе чтобы сделать маску это не понадобится Ты знаешь двоичные операторы сдвига влево сдвига вправо Да да тебе по сути в данной ситуации чтобы сделать маску тебе он только и понадобится так и допустим у нас есть копия нашего числа Ну наш какой-то результат будет хорошо теперь нам нужно индекс это собственно Куда куда мы с этим значение Теперь мы делаем мы будем сдвигать вправо влево Почему вправо ада Нам же нужно подвинуть туда то мы сейчас будем наше число C двигать в

    00:25:46 - 00:27:22

  • левую собственно Так подожди Так ты просто по сути сдвинешь все твои биты числа C уйдут влево да и у тебя вплоть до индекса все по сути заполнится нулями То есть как бы тут что-то не то нам другая маска нужна вот я изначально хотел сдвинуть вправо чтобы чтобы младший бит был как раз таки наш нужный так смотри битовая маска давай вот как бы немного другое понятие Да вот получается что Смотри вот предположим у тебя уже есть какое-то твое число Да как ты у числа можешь взвести Как ты можешь заставить единицу

    00:26:55 - 00:28:31

  • используя оператор или что тебе для этого понадобится Мне нужно как бы Ну если там уже стоит единица тут на то мне нужно чтобы была операция или с числом Где в этом месте ноль То есть все нули будут Вот а если там нолик то мне нужно сделать логическое или с числом Где на этом и индексе стоит единица не Ну смотри у тебя если например тебя даже если там находится единица Да ты туда хочешь засветать единицу то тебе если ты сделаешь единица или единица это будет как бы все нормально то есть оно единица

    00:27:48 - 00:29:07

  • и оставила Я просто да я подумал что типа единица перенесется на следующий разряд но вспомнил что это не произойдет так что да то есть по сути нам нужно сделать просто логической или числом где нужно индекс состоит единица или 0 если мы хотим засветать единицу так то есть если да один или да то будет один хорошо Как мы можем получается Если мы хотим засадить ноль то что мы должны сделать то мы должны сделать логическое и с чем числом где числом Где на нужном индексе будет 0 в остальных местах единицы Хорошо давай

    00:28:28 - 00:29:49

  • рассмотрим Давай рассмотрим первый случай он такой более простой Да давай мы как бы сделаем мол Ив битва Да если у нас положительные как бы дату мы то есть положительный труп Вот и соответственно Давай мы попробуем единицу а потом уже может дойдем до того как Угу Так ну Я тебе сразу говорю цикл не понадобится то есть вот ну давай все чтобы у нас появились такое и начнем думать вот Хорошо смотри мы обсудили до что чтобы взвести единицу Да Нам нужно сделать или с единицей Как нам получить число в котором на все остальные нули да

    00:29:09 - 00:31:02

  • А на этой позиции единица Как мы можем получить нам нужно собственно [музыка] взять единицу и подвинуть ее столько раз сколько индекс Ну подвинуть 32 минус индекс раз влево не просто индекс раз влево то есть индекс мы считаем слева и например индекс 3 и мы хотим прийти в индекс собственно три Вот то есть не минус не 32 Ну как бы условно мы движемся как бы справа налево по памяти соответственно индекс это индекс тоже с правой налево Хорошо давай сделаем такую маску [музыка] цикл не нужен работаем

    00:30:10 - 00:31:48

  • маска равно единица и теперь в цикле можно написать Вот так вот супер хорошо все отлично У нас есть маска теперь давай мы наш C сделаем собственно взведем ему можно прямо здесь написать нам или Да можно и так ценам даже данной ситуации не понадобится Хорошо теперь давай тогда пойдем велса и сделаем то же самое только только в случае если мы сбрасываем что получается не очень красиво но зато более наглядно Вот и в целом на собеседованиях смотри если тоже такой совет то есть решаешь задачу не чувствуешь себя уверенно начинаешь

    00:31:08 - 00:32:40

  • писать не думай про то чтобы писать красиво думая про то чтобы это читалось читалось для интервьюера Вот хорошо Как нам теперь как мы обсуждали Как нам сбросить Как нам засадить ноль какой-то конкретный индекс так Ну я бы завел снова вот эту маску Сейчас объясню почему теперь я хочу сделать число где все единицы то есть будет максимальное число вот максимальное число и у нас есть маска и мы сделаем Сор можно это даже проще я понимаю куда ты идешь как бы все хорошо но можно это сделать проще проще

    00:32:00 - 00:33:18

  • Скажи какую ты маску хочешь получить Ну все единицы там 0 и присоединиться хорошо вот как-то из Маски может такую из твоей переменной маски Как ты можешь такую маску получить Ну можно всех единиц вычесть вот эту маску Ну сделать логическое сейчас Ну что мы сделаем а нам нужно этот сделать инвертировать хорошо то есть там сразу возьмем скобочки и все такое так я надеюсь можно писать Да конечно и Хорошо теперь давай завершать это дело нам [музыка] написал правильно Поэтому Окей только уже убираем последний тур он

    00:32:45 - 00:34:21

  • получается лишний да все вот в принципе задача решена как бы спотыкались но к решению пришли отлично дальше пока что демонстрацию Можешь закрывать В общем в целом задачки это часто возникающие речь Поэтому потренируйся подтяни чтобы налиту в общем это дело так хорошо смотри далее что же такого Можно спросить о вот тут больше Надо подумать на порассуждать смотри Знакомы ли тебе понять стерилизация и десеризация да знакомым то есть ну стерилизацию тогда мы хотим какую-то структуру данных грубо говоря

    00:33:59 - 00:35:31

  • записать допустим текстовые файл сигнализация это обратный процесс то есть из какого-то предположим файла из какого-то из каких-то данных получить некий объект программы на какие виды можно разделить стерилизацию с точки зрения На какие виды с точки зрения плюс плюс не только с точки зрения Какие виды даже не ну можно просто протекторы да вот как еще по идее мы можем это сделать можно если у нас есть какой-то объект он как-то в памяти представлен наверное можно собственно кусок памяти как-то попытаться стерилизовать Ну да в

    00:34:49 - 00:36:31

  • принципе так и есть Это называется как бы двоичная там или бинарная стерилизация Вот это тоже да есть такое то есть по сути именно что кусок памяти сохраняем и с ним дальше работаем такой довольно таки на поверхности вот какой может быть недостаток у этой двоичной стерилизации и достоинства сразу Какое давай с другой стороны подойдем сначала Какое может быть достоинство у двоичной стерилизации относительно цивилизации в том или ином текстовом виде Ну достоинств наверное в том что это довольно таки просто реализовать то есть

    00:35:42 - 00:36:58

  • ну окей Не буду говорить прямо уверенно сложность не будем рассуждать то есть предположим все реализовать одинаково просто преимущество какой я не знаю вот недостаток сразу напрашивается что если мы будем здесь реализовывать то она может не хватить памяти который у нас есть под собственно то что мы из файла здесь реализуем в программу мы начали здесь реализовать начали какую-то память выделять ее не хватило и все Я немного про другое говорил вот смотри получается вот ты предположим с Джейсоном Я думаю ты знаком Да вот ты

    00:36:19 - 00:37:43

  • записываешь свои данные про свой файл в GSM формате Да Джейсон какой-то файл что помимо непосредственно данных у тебя как бы будет также Ну какие-то разделители да разделители пробелы и так далее То есть что это все это что такое будет что она Что даст Ну она здесь реализации даст нам понять что это такое как бы с точки зрения Вот именно преимущества Ну файл возможно будет побольше Вот но хорошо Мы например Какое Зато какое будет Вот недостаток тоже вот он напрашивается если мы будем записывали Да много много каких-то

    00:37:04 - 00:38:39

  • объектов они там подряд лежат все очень компактно относительно особенно компактный относительно какого-нибудь Вот и соответственно мы это дело назад читаем что может что теоретически может пойти не так Какие вот такие в особенности есть и плюс плюс которые могут нам помешать особенности Ну даже не знаю может быть что-нибудь может быть не так если мы встретим там backstage 0 например Нет я не об этом но это 007 без разницы будет все будет хорошо Ну если мы допустим это хотим стерилизовать сначала в час звездочку то

    00:38:00 - 00:39:22

  • там если будут Сразу говорю терминированных строках то есть нули наша программа переварит у нее все с этим будет нормально Вот смотри плюс например что ты знаешь вот что не так например Симптом Что не так бывает Может там точки с точки зрения теории int он какой размерность имеет там зависимости от операционной системы но на Win32 собственно он имеет размер там хорошо если наш код вот наша программа она существует не только на 32 разрядной системе Ну тогда тогда будут проблемы потому что если мы

    00:38:46 - 00:40:23

  • пишем по 32-х разрядную систему то у нас Intel весе там 4 байта от 64 разрядную то собственно 8 байтов они будут есть проблемы [музыка] То есть целом данные Как будут вполне могут быть не портируемыми то есть плюс еще помимо этого у нас может быть на одной платформе будет выравнивание на другой платформе выравнивание не будет короче данные неудобные Для распространения Хорошо смотри Вот это такое скажем так часто запрашивали в комментариях да Поэтому решил тоже такой подобный вопрос включить посмотреть как ты данной

    00:39:39 - 00:41:15

  • ситуации порассуждаешь то есть вот у нас есть смотри что вот мы например стерилизуем массив как бы все понятно Да друг за другом этом все поселизовали и прочее но как бы ты реализовывал все на бинарное мы забываем это нам не интересно мы говорим например там работаем с жизнью Да у нас есть концентрализация вот как бы ты стерилизовывал такие такую структуру данных как двунаправленный список список Ну я бы хотел направленный список а потом уже продолжим Как как бы ты его стерилизовывал Ну да правильно список это просто список где

    00:40:40 - 00:42:01

  • Каждый элемент имеет указатель на следующий элемент и на предыдущий хорошо вот когда его реализовывал я бы допустим Ну давайте для простоты представим что нас список из инфов то я бы представлял каждый узел как допустим само значение Вью потом следующий его поле указатель следующий элемент на предыдущий чтобы себя представляете указатели то есть понятно что в твоей программе это будет указатель это будет какой-то адрес все будет хорошо допустим для первого элемента указатель указатель на предыдущий элемент будет

    00:41:22 - 00:42:48

  • ПТР и можно в тексте программы вернее стерилизовать его как нолик А указатель на следующий как единичку Ну то есть ты вместо указателей ты бы Например стерилизовал индексы Да ну то есть у нас все равно список он последовательный и в нашем файле в итоге они будут по порядку располагаться и понятно кто за кем идет мы будем просто показывать у нас что-то дальше есть или нет получается что этот список он может быть не очень-то последовательным как бы То есть в принципе можно зациклиться да мы плюс еще смотри мышь по сути если это

    00:42:13 - 00:43:35

  • какой-то вот он двунаправленный Да у нас есть ним сложность то есть мы по сути можем взять любой какой-то элемент Да и например они идут последовательно да Ну и все там друг на друга Вот эта цепочка у них работает следующий указывает на следующего предыдущего предыдущего на что если мы берем приходим конкретному элементу и говорим ему что у тебя сейчас предыдущий не этот А например единица это в принципе Будет легальная ситуация для направленного списка такая вот это вот странная структура данных Вот

    00:42:58 - 00:44:03

  • чего тогда вот как ты бы это мог решить например своей стерилизации [музыка] Можно наверное хранить деньги то есть высчитывать расстояние до корня То есть у нас есть элементы мы знаем Сколько от него элементов до нашего корня и хранить собственно вместо этих там хранить сколько ему расстояния до предыдущего элемента и до следующего элемента То есть если мы вставим в наш список почти хорошо только можно еще проще сделать потому что вот эти сдвиги они потребуют от тебя Придите реализации каких-то определенных там телодвижений

    00:43:30 - 00:44:55

  • да то есть надо будет посчитать Вот хорошо они вот у нас Пусть они все равно то есть по сути мы можем их абсолютно спокойно у нас там будет например как мы их можем проще всего между собой связать Кто в реальности будет идти за кем и кто После кого и кто перед кем и так далее можно если Вы только сдвиги только еще проще ну как-нибудь занумеровать их можно не знаю Ну да да речь об этом и что мы можем в каждой в Каждый элемент указать Каждый элемент будет знать свой порядковый номер и порядка номер как бы

    00:44:13 - 00:45:32

  • своего предыдущего и следующего элемента Да все верно Ну то есть от зигов которые более сложные алгоритмические Да мы просто переходим к индексам Да таким образом Ну как один из способов стерилизации такой сложной структуры не то что сложный дерево будет сложнее не знаю если знать правила то в принципе дерево Можно и как массив положить и все Потом просто уложить в дерево Ну наверное вот я имею чтобы правильно порядок сохранился как дереве но Ладно не будем я к этому сейчас не готов разговор будем

    00:44:55 - 00:46:17

  • двигаться дальше Хорошо смотри Знакомы ли тебе ключевое слово Union Union Union Если честно нет в плюсах такого не встречал Вообще нигде ну тогда конечно обязательно пройдись Да периодически такие вопросы могут возникать это по сути еще сишная структура которая позволяет [музыка] вы как-то сказать у нее могут быть например условно как мы объявляем структуру Да у нее Может быть там int какая-то строка там другой какой-то Булл или что-то в этом роде Union это по сути объявление будет такой же самое но все структуры хранятся как

    00:45:41 - 00:47:04

  • бы в одной области памяти то есть по факту например Юнион размером будет занимать как самое то есть например там будет до 64-разрядный просто int и например Булл соответственно Юнион будет занимать всего 8 байт Вот и но при этом мы сможем работать его отдельными полями и все эти записи они будут происходить в одно и то же как бы место в памяти вот довольно таки важная часть из этого [музыка] разные маски с ними тоже работает Это строится поэтому обязательно пройдись возьми на заметку также вариант из 17

    00:46:24 - 00:47:44

  • стандарта Он построен на июне Вот именно в его основе лежит как бы именно старый сичный Юнион вот опять таки это не сто процентов Но это считается как его типа безопасная не идти по безопасной а по типу данных безопасная замена Вот хорошо Тогда другую сторону немного Вот смотри возьмем 11 Стандарт плюс который можно сказать почему он Но это немного порассуждать Да вот я работал с кьютом в кьюти по сути отзеркаливается стандартная библиотека Есть такое у нас дело векторы стринги и так далее Вот что-то

    00:47:03 - 00:48:41

  • реализовано лучше что-то хуже Но как есть как ты считаешь Почему вообще в кьюти существуют их реализации и Почему вообще так много библиотек которые Ну то есть это будет Unreal Engine какой-нибудь который у них есть какая-то определенная история там много лет Почему Практически все так или иначе писали свою реализацию Ну раньше просто этого не было в основном стандарте и в основном все это было написано в бусте вот а буст он такой большой что тянуть его во все там проекты это не очень прикольно Вот

    00:47:53 - 00:49:13

  • смотри да да тоже тут верно Да буст много где экранировался вместо как бы стандартный библиотеки брался Boost но вот вот мы возьмем например вот самый простой std Вектор Да и он есть везде и в принципе стандартной библиотеке он Я не знаю 98 года был я так уже точно не скажу вот тоже давно вот что с ним было не так в целом не так ну потому что не было му семантики и там Там постоянно было копирование копирование копирования для каких-нибудь больших объектов это очень дорогостоящая операция копирование на

    00:48:34 - 00:49:49

  • каких операциях было Вот если мы с вектором вектор копирование было там при передаче функции допустим если Ну если там не посылки в принципе Конечно есть обходные варианты для того чтобы передавать по значению как это кстати обходной вариант называется чтобы передавать по значению они по ссылке Я сейчас не знаю затрудняюсь ответить получается в случае с Q string на ты можешь его Как безболезненно передать в метод и получается вот если стандартную строку Ты передаешь то естественно ты ее передал она в любом случае скопируется

    00:49:15 - 00:50:40

  • память выделиться и так далее То есть мы это выделяем Передаем этом посылки Вот Но в qc ты можешь string передать и как бы у тебя не произойдет копирование сразу при передаче знаешь почему это происходит или нет Это очень многих абсолютно спокойно передается значение и чувствует себя комфортно Это вроде называется копию райт Да все верно параметр только если он изменится внутри произойдет копирование Да что конечно упрощает во многих ситуациях процесс написания кода хорошо но вернемся к стандартным библиотеке то есть речь не

    00:50:03 - 00:51:30

  • про передачи функции копирование при передаче функции но как есть так и было Если писать как бы неправильно вот какую например операцию над вектором можно сделать что у нас произойдет много копирований нам ставить элемент в середину или удалить да то есть Мы удалим у нас хвост будет скажем так туда-сюда двигаться Да все все тут хорошо Я доволен прямо максимально в этом плане все хорошо Да не было математики поэтому у нас сейчас такая ситуация что миллион реализации стандартной библиотеки так а Знакомы ли тебе такое понятие как

    00:50:54 - 00:52:12

  • функтор пунктер Да знакомо это объект которого есть какие-то поля То есть он хранит какое-то состояние и у него определенно оператор круглые скобки То есть это Колобок вот плюсах лямбда функции насколько я знаю они компилируются как раз таки в фрукты то есть какую-то структуру у которых есть поля и вот этот оператор круглые скобки хорошо компилируется как функтор до добавляются вот эти вот поля для чего для чего с точки зрения лямбды могут понадобиться эти поля Ну лямбда может захватывать там какой-то

    00:51:38 - 00:53:03

  • контекст какие-то переменные в себя полях сохранять Хорошо смотри а что такое предикат прийти к Ну это функция которая возвращает там Bull True false а ну собственно функция хорошо все отлично Еще такой момент смотри Вернемся немного обратно к стандартной библиотеке Да вот смотри у тебя такая ситуация хочешь написать свою коллекцию Да и хочешь написать но как бы видишь что очень много нужного тебе функционала реализована в векторе Да и как бы хочется кахами себе время соответственно решаешь что ты хочешь как-то расширить

    00:52:39 - 00:54:22

  • функционал вектор и стандартной библиотеки шаблонов как бы ты поступил Как бы ты это делал Вот ты смотри ты хочешь написать свой класс который извиняюсь который будет в принципе с ним будет работа происходить как будто бы это Вектор Только ты будешь еще каких-то своих там немного функций там добавлять каких-то своих артефактов и так далее вот как бы ты это делал Ну я бы сделал закрытое наследование от вектора наверное так если сходу хорошо вот смотри ну то есть ты бы от вектора наследовался Да вот давай теперь включи пожалуйста

    00:53:35 - 00:55:06

  • демонстрацию экрана вообще так скажу контейнеры из стандартной библиотеки шаблонов Да они как бы не спроектированы для того чтобы от них наследоваться на самом деле то есть в идеале как-то делать именно какой-то класс в раппер Да но это как бы ничего что ты это сказал да Вот смотри я закинул тут кусок реализации из вектора и вот смотри при взгляде скажем так на этот кусок реализации назовем это так что мы можем сказать почему не очень-то Вектор будет хорошо работать если мы от него наследуемся Ну нам нужно будет помечать все новые

    00:54:20 - 00:56:05

  • септом Нет не то это Хорошо пусть будет новый почему не хорошо Вот какие у нас же функции есть Так оператор перемещения Ну оператор присваивания перемещением а у нас инструктора не виртуальный да да все правильно деструктор у нас не виртуальный соответственно на следующий развороченность мы просто себе будем создавать как бы потенциальные утечки памяти и так далее вот отлично Хороший ответ и Давай наверное на этом закругляться выбирать демонстрацию экрана и давай переходить к фидбэку сейчас я возьму ноутбук чтобы видеть

    00:55:15 - 00:56:53

  • скажем так вопросы чтобы ничего не забыть по технической части смотри В целом как бы не понравилось да то есть где не знал то в принципе думаешь с какими-то подсказками это как бы хорошо Ну надо Надо не сдаваться В общем и так далее да и это много кто любит смотри Но конечно что не очень хорошо Это то что не знаешь вот как бы на Ключевом слове Stern так споткнулись про extern C обязательно Изучи Да в этом плане как бы надо знать это как бы спрашивают вот далее июня что тоже не знал как бы основа полагающая

    00:56:18 - 00:57:50

  • хищная структура и как бы много где она используется на самом деле поэтому особенно если какая-то работа будет возможно железом с регистрами это тоже нужно вот из хорошего по пунктам отлично рассказал отлично показал как бы продемонстрировал понимание сообразил вот с виртуальным диструктором я Мне понравилось и в целом также говоришь хорошо говоришь уверенно мне мне все нравится вот Спасибо большое Может ты что-то хочешь сказать что-то добавить Ну немножко был как это обычно и бывает готовился не к

    00:57:03 - 00:58:45

  • Тому но Получилось как получилось в принципе это полезный опыт хорошо так да еще момент бинарные операции в общем тоже надо как бы повторять чтобы Как говорится от зубов отскакивала Вот хорошо тогда все давай прощаться В общем всем зрителям пока пока

    00:57:55 - 00:58:39

Менторы

Специалисты своей области, которые смогут помочь вам

  • Нигма Нурия
    Нигма Нурия

    Middle .Net Developer

  • Сущенко Татьяна
    Сущенко Татьяна

    Senior Product Manager

  • Гудков Денис
    Гудков Денис

    Middle Python Developer

  • Курочкин Константин
    Курочкин Константин

    Ведущий программист

  • Гудман Макс
    Гудман Макс

    Backend Software Engineer (PHP)

  • Гребенкин Антон
    Гребенкин Антон

    Senior .NET/C# developer

  • Ахназаров Фёдор
    Ахназаров Фёдор

    Middle DevOps Engineer | Tbilisi, Georgia

  • Шорохов Дмитрий
    Шорохов Дмитрий

    Middle C# .NET

  • Жуков Александр
    Жуков Александр

    Senior PHP-разработчик

  • Мазикин Павел
    Мазикин Павел

    Middle python developer

© 2024 HireGuru. Сделано в Санкт-Петербурге с hireguru.ru