#4. Примеры реализации статических массивов на C++ | Структуры данных
HTML-код
- Опубликовано: 21 сен 2022
- Обучающий курс: stepik.org/a/134212
Инфо-сайт: proproprogs.ru/structure_data
Примеры объявления и использования статических массивов в языке программирования C++
Спасибо за столь приятное и понятное объяснение!
да какой же там у тебя запас продуктивности? я не успеваю просматривать твои видео как ты делаешь новые. И качество отменное. Просто клад, спасибо большое!!!
> И качество отменное
Не хочу принижать ценность трудов автора, но поверьте мне, если вы будете писать такой код на собеседовании даже не на джуниор, а на стажерскую позицию, вас в нормальную компанию не возьмут.
@@denisobrezkov4354 ну так это же обучающий материал, мне не понятно ООП или структуры данных, Балакирев отлично объясняет именно его, доступным мне языком. Думаю если он будет обучать тому, какой именно код писать, он и с этим справится.
Посоветуй и ты тогда, где посмотреть то - КАК писать правильный код
@@MrNagios если человек так пишет код, я бы просто не стал доверять ему в любом случае. Где гарантия, что другие вещи он объясняет правильно? Я бы рекомендовал читать CPPCoreGuideLines и книжки Майерса по С++.
@@denisobrezkov4354 а что конкретно не так с этим кодом?
@@denisobrezkov4354 Выкладываете свои видео, а мы посмотрим. Заодно научимся как нужно писать код, правильно
Очень полезные видео, информация хорошо в голову укладывается. Отдельное спасибо за лайв-кодинг! Когда программа пишется построчно - это воспринимается намного лучше, чем когда делаются склейки со вставками кусков кода.
Только начал смотреть.
Спасибо что ты есть, добрый человек! Потмоу что не в каждой книге настолько понятно и доходчиво объяснят.
Конечно же книги читаю, но там бывают куда более худые примеры.
Сергей, спасибо! Никогда до этого дня не программировал на C++. Специально установил себе компилятор, чтобы самому все это дело руками проверить. Просто супер! И да, вы правильно сделали, что выбрали C++ для этой темы) Можно было еще выбрать Go, однако на нем точно пишут меньше людей, чем на Python и C++
Надо же я все понял хотя только пайтон знаю. Думаю надо c++ вторым языком выучить для хорошего понимания работы структур данных. В пайтоне это все не очевидно и он непостоянный какой-то. Отличное видео спасибо)
Как всегда очень интересное видео! Спасибо!
Почему мы не делаем в программе "удаление элемента из массива" такую же проверку(выход за границу при сдвиге элементов на один право), как в первой задаче?
Если у нас 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;
}
15:40 при `count_marks == 20` в 15 строчке в `marks[i + 1]` мы получим индекс превышающий верхнюю границу массива (index out of range). C++ производит какой то контроль этого и приложение упадет? Или мы просто прочитаем следующий за отведенной для массива памяти байт (в котором будет все что угодно)?
Можете показать реализацию красно черного дерева ?)
А разве в сторонних библиотеках питона нет поддержки статичиских массивов. Я что то слышал о таких типах данных как array.array и в numpy тоже что то подобное есть, могу ошибаться
в базовом Python нет, в numpy да, можно его считать статическим, верно
А почему не используете cout?
без разницы, можно и его
Был бы у меня такой препод...
Добрый день,Сергей сделайте пожалуйста возможность оплатить ООП курс на stepik не только из России,а из других тоже
Я могу ошибаться, но это не его проблема. Надо задавать вопрос разработчикам Stepik.
да, это вам нужно в поддержку Stepik писать, я к этом сервису не имею отношения
я так понял след будет тоже самое но на питоне?
на питоне нет статических массивов, поэтому дальше динамический массив
Я, конечно, придираюсь. Для начинающих программистов, наверное, такое упрощение уместно, но, строго говоря, массив, создаваемый в C++ с помощью оператора new(), в большинстве источников по C++ (и во всех, попадавшихся лично мне) определяется как динамический массив. Я посмотрел следующий урок, где вы определяете динамический массив как массив, который может менять свой размер в процессе работы программы. Это наталкивает на противоречие.
Многие столкнутся таким определением статического и динамического массивов в C++: массив, размер которого должен быть задан константным значением на этапе компиляции, это статический массив. В свою очередь массив, размер которого может быть определен во время исполнения программы, - динамический.
Просто получается, что по вашей логике в C++ динамическим массивом может считаться std::vector, который имеет все отвечающие вашему определению функции: push_back(), pop_back(), resize() и т.п. Но это просто шаблонизированная надстройка над встроенным динамическими массивами, создаваемыми через new().
То есть, наверное, можно сказать, что описанная вами в следующем уроке логика динамического массива, это логика часто встречающейся его высокоуровневой реализации. В то время как массивы, созданные через new(), отвечает ключевому низкоуровневому определению. Звучит немного коряво, но, надеюсь, понятно. )
Было бы неплохо акцентировать на этой возможной путанице внимание.
Есть такая путаница, но в данном случае речь идет о массиве, который меняет свои размеры, а динамика оператора new лишь означает, что мы создаем массив "на лету" в процессе работы программы, а не прописываем заранее. Здесь слово "динамический" используется в разных смыслах.
@@selfedu_rus
И все же, массив, создаваемый с помощью new - это динамический массив априори. И разница здесь в хранении информации (в какой области памяти)
Статический массив - это массив на стеке, т.е. весь массив лежит на стеке и его размер должен быть известен на момент сборки кода. Динамический массив -это массив в куче, на стеке создается только переменная которая будет хранить адрес массива который можно будет создать в куче, любого размера, и через этот адрес получить доступ к массиву.
Память, выделенную под динамический массив следует освобождать принудительно, чтобы избежать ее утечек.
@@electronic008 верно ли я понимаю: массив с переменной через new как показано во втором способе - это массив, размер которого не известен на момент запуска программы, но который можно задать по ходу её работы только один раз ? То есть когда n будет равен 100, y будет указывать на кусок памяти в 400 байт и этот кусок памяти будет неизменен в своем размере до конца работы блока.
А динамический массив же можно менять в размере столько сколько потребуется ?
@@alex6161
Что-то вы смешали все в кучу. Массив c оператором new в C++ (и malloc()/calloc() в С) - это и есть динамический массив.
Динамический массив в С - это массив, у которого количественное значение ячеек задается переменной, а значит, его размер может изменяться. Такие массивы нужны для того, чтобы более эффективно эксплуатировать оперативную память компьютера в С-программах. Напомню, что в статическом массиве количество ячеек задается числовой константой, а не переменной.
И главное отличие - в области хранения памяти (в куче (Heap) в случае динамического массива и на стеке в случае статического.)
@@alex6161
Для хранения динамического массива (вектора) используется непрерывная область памяти. Всякий раз, когда вам нужно выделить больше памяти, а память недоступна в текущем расположении, весь массив копируется в другое расположение и выделяется дополнительная память.