#4. Примеры реализации статических массивов на C++ | Структуры данных

Поделиться
HTML-код
  • Опубликовано: 21 сен 2022
  • Обучающий курс: stepik.org/a/134212
    Инфо-сайт: proproprogs.ru/structure_data
    Примеры объявления и использования статических массивов в языке программирования C++

Комментарии • 35

  • @user-he9wc5pq3f
    @user-he9wc5pq3f 23 дня назад +1

    Спасибо за столь приятное и понятное объяснение!

  • @MrNagios
    @MrNagios Год назад +38

    да какой же там у тебя запас продуктивности? я не успеваю просматривать твои видео как ты делаешь новые. И качество отменное. Просто клад, спасибо большое!!!

    • @denisobrezkov4354
      @denisobrezkov4354 Год назад

      > И качество отменное
      Не хочу принижать ценность трудов автора, но поверьте мне, если вы будете писать такой код на собеседовании даже не на джуниор, а на стажерскую позицию, вас в нормальную компанию не возьмут.

    • @MrNagios
      @MrNagios Год назад +1

      @@denisobrezkov4354 ну так это же обучающий материал, мне не понятно ООП или структуры данных, Балакирев отлично объясняет именно его, доступным мне языком. Думаю если он будет обучать тому, какой именно код писать, он и с этим справится.
      Посоветуй и ты тогда, где посмотреть то - КАК писать правильный код

    • @denisobrezkov4354
      @denisobrezkov4354 Год назад

      @@MrNagios если человек так пишет код, я бы просто не стал доверять ему в любом случае. Где гарантия, что другие вещи он объясняет правильно? Я бы рекомендовал читать CPPCoreGuideLines и книжки Майерса по С++.

    • @evgeniyamoroz8153
      @evgeniyamoroz8153 Год назад +2

      @@denisobrezkov4354 а что конкретно не так с этим кодом?

    • @user-dp1dx3ir6j
      @user-dp1dx3ir6j Год назад +2

      @@denisobrezkov4354 Выкладываете свои видео, а мы посмотрим. Заодно научимся как нужно писать код, правильно

  • @arch9834
    @arch9834 10 месяцев назад +2

    Очень полезные видео, информация хорошо в голову укладывается. Отдельное спасибо за лайв-кодинг! Когда программа пишется построчно - это воспринимается намного лучше, чем когда делаются склейки со вставками кусков кода.

  • @betep3526
    @betep3526 11 месяцев назад +2

    Только начал смотреть.
    Спасибо что ты есть, добрый человек! Потмоу что не в каждой книге настолько понятно и доходчиво объяснят.
    Конечно же книги читаю, но там бывают куда более худые примеры.

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n Год назад +2

    Сергей, спасибо! Никогда до этого дня не программировал на C++. Специально установил себе компилятор, чтобы самому все это дело руками проверить. Просто супер! И да, вы правильно сделали, что выбрали C++ для этой темы) Можно было еще выбрать Go, однако на нем точно пишут меньше людей, чем на Python и C++

  • @mavendalzhidar3382
    @mavendalzhidar3382 Год назад +3

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

  • @siarheiulas6969
    @siarheiulas6969 Год назад +2

    Как всегда очень интересное видео! Спасибо!

  • @eldarbilyalov8350
    @eldarbilyalov8350 3 месяца назад +1

    Почему мы не делаем в программе "удаление элемента из массива" такую же проверку(выход за границу при сдвиге элементов на один право), как в первой задаче?
    Если у нас 20 оценок, и мы хотим удалить 20 оценку ( оценку с индексом 19), то получается, что мы присвоим адресу, где хранится 19 оценка, адрес 20 ячейки массива marks[19] = marks[20];, но его у нас нет, получается, что мы вышли за границы массива. Мы присвоим 19 ячейки мусор? Также мне кажется нужно удалять значение из ячейки, которое было до сдвига. Предлагаю следующий вариант кода, подскажите, правильно ли я рассуждаю?
    #include
    int main(){
    const int N = 20;
    char marks[N] = { 2, 4, 2, 3 };
    int count_marks = 4;
    int index_delete = 3;
    int end = (count_marks < N) ? count_marks: N-1;
    for(int i = index_delete; i < end; i++){
    marks[i] = marks[i+1];
    }
    marks[count_marks-1] = 0;
    if (count_marks > 0){
    count_marks--;
    }
    for (int i = 0; i < count_marks; i++){
    std::cout « marks[i] « std::endl;
    }
    return 0;
    }

  • @gribovmax
    @gribovmax 8 месяцев назад +2

    15:40 при `count_marks == 20` в 15 строчке в `marks[i + 1]` мы получим индекс превышающий верхнюю границу массива (index out of range). C++ производит какой то контроль этого и приложение упадет? Или мы просто прочитаем следующий за отведенной для массива памяти байт (в котором будет все что угодно)?

  • @koshakpoc2876
    @koshakpoc2876 Год назад +1

    Можете показать реализацию красно черного дерева ?)

  • @firstandlast4435
    @firstandlast4435 Год назад +1

    А разве в сторонних библиотеках питона нет поддержки статичиских массивов. Я что то слышал о таких типах данных как array.array и в numpy тоже что то подобное есть, могу ошибаться

    • @selfedu_rus
      @selfedu_rus  Год назад +1

      в базовом Python нет, в numpy да, можно его считать статическим, верно

  • @baxram97
    @baxram97 Год назад +2

    А почему не используете cout?

    • @selfedu_rus
      @selfedu_rus  Год назад

      без разницы, можно и его

  • @Katar1x
    @Katar1x 11 месяцев назад +1

    Был бы у меня такой препод...

  • @romanyshyn6311
    @romanyshyn6311 Год назад

    Добрый день,Сергей сделайте пожалуйста возможность оплатить ООП курс на stepik не только из России,а из других тоже

    • @dinnerbone313
      @dinnerbone313 Год назад

      Я могу ошибаться, но это не его проблема. Надо задавать вопрос разработчикам Stepik.

    • @selfedu_rus
      @selfedu_rus  Год назад

      да, это вам нужно в поддержку Stepik писать, я к этом сервису не имею отношения

  • @WixxTeR
    @WixxTeR Год назад +1

    я так понял след будет тоже самое но на питоне?

    • @selfedu_rus
      @selfedu_rus  Год назад

      на питоне нет статических массивов, поэтому дальше динамический массив

  • @nikitun85
    @nikitun85 Год назад +4

    Я, конечно, придираюсь. Для начинающих программистов, наверное, такое упрощение уместно, но, строго говоря, массив, создаваемый в C++ с помощью оператора new(), в большинстве источников по C++ (и во всех, попадавшихся лично мне) определяется как динамический массив. Я посмотрел следующий урок, где вы определяете динамический массив как массив, который может менять свой размер в процессе работы программы. Это наталкивает на противоречие.
    Многие столкнутся таким определением статического и динамического массивов в C++: массив, размер которого должен быть задан константным значением на этапе компиляции, это статический массив. В свою очередь массив, размер которого может быть определен во время исполнения программы, - динамический.
    Просто получается, что по вашей логике в C++ динамическим массивом может считаться std::vector, который имеет все отвечающие вашему определению функции: push_back(), pop_back(), resize() и т.п. Но это просто шаблонизированная надстройка над встроенным динамическими массивами, создаваемыми через new().
    То есть, наверное, можно сказать, что описанная вами в следующем уроке логика динамического массива, это логика часто встречающейся его высокоуровневой реализации. В то время как массивы, созданные через new(), отвечает ключевому низкоуровневому определению. Звучит немного коряво, но, надеюсь, понятно. )
    Было бы неплохо акцентировать на этой возможной путанице внимание.

    • @selfedu_rus
      @selfedu_rus  Год назад

      Есть такая путаница, но в данном случае речь идет о массиве, который меняет свои размеры, а динамика оператора new лишь означает, что мы создаем массив "на лету" в процессе работы программы, а не прописываем заранее. Здесь слово "динамический" используется в разных смыслах.

    • @electronic008
      @electronic008 Год назад +1

      @@selfedu_rus
      И все же, массив, создаваемый с помощью new - это динамический массив априори. И разница здесь в хранении информации (в какой области памяти)
      Статический массив - это массив на стеке, т.е. весь массив лежит на стеке и его размер должен быть известен на момент сборки кода. Динамический массив -это массив в куче, на стеке создается только переменная которая будет хранить адрес массива который можно будет создать в куче, любого размера, и через этот адрес получить доступ к массиву.
      Память, выделенную под динамический массив следует освобождать принудительно, чтобы избежать ее утечек.

    • @alex6161
      @alex6161 Год назад

      @@electronic008 верно ли я понимаю: массив с переменной через new как показано во втором способе - это массив, размер которого не известен на момент запуска программы, но который можно задать по ходу её работы только один раз ? То есть когда n будет равен 100, y будет указывать на кусок памяти в 400 байт и этот кусок памяти будет неизменен в своем размере до конца работы блока.
      А динамический массив же можно менять в размере столько сколько потребуется ?

    • @electronic008
      @electronic008 Год назад

      @@alex6161
      Что-то вы смешали все в кучу. Массив c оператором new в C++ (и malloc()/calloc() в С) - это и есть динамический массив.
      Динамический массив в С - это массив, у которого количественное значение ячеек задается переменной, а значит, его размер может изменяться. Такие массивы нужны для того, чтобы более эффективно эксплуатировать оперативную память компьютера в С-программах. Напомню, что в статическом массиве количество ячеек задается числовой константой, а не переменной.
      И главное отличие - в области хранения памяти (в куче (Heap) в случае динамического массива и на стеке в случае статического.)

    • @electronic008
      @electronic008 Год назад

      @@alex6161
      Для хранения динамического массива (вектора) используется непрерывная область памяти. Всякий раз, когда вам нужно выделить больше памяти, а память недоступна в текущем расположении, весь массив копируется в другое расположение и выделяется дополнительная память.