Этот канал просто золотая находка для любого, кто изучает программирование. Крутые, подробные и понятные объяснения. Не понимаю, почему у некоторых посредственных ютуберов, которые обучают программированию, невероятно большая аудитория, а этого канала так мало - несправедливо
Не торопитесь пожалуйста переходить на c# а доучите нас до конца то есть что вы запланировали на c++ (хотелось бы и затронуть оконные приложения на c++ так же подробно)
Огромное спасибо за уроки! Отличная подача материала. Заметил, что в плейлисте "Основы C++. Программирование для начинающих" этот урок стоит после урока по списку и после урока по ключевому слову auto, где уже активно упоминаются итераторы.
Спасибо за урок. Теперь понял, что при доступе к элементам контейнера через цикл for в его описании за ключевым словом auto скрывается объявление итератора. На других каналах этому внимания не уделяется, а для новичков такие вещи как раз важны.
Разобрался. Когда я просто приписал "с" к методам, следуя указаниям автора, то компилятор выдавал ошибку. Но когда я стер метод и написал его заново, ошибка пропала... Сначала выпал в осадок от такой ситуации, а потом случайно заметил, что при приписывании "с" методам я использовал кириллицу :) Совсем забыл, что для компилятора с на кириллице и на латинице - это разные символы.
Хм.. не нарушится ли логика, если контейнер будет, например, не интовым? Возможно ли будет делать инкримент для какого-либо другого типа данных? Т.е., даже если мы все int заменим на string, а потом в цикле for будем делать инкримент для нашего счётчика, удастся ли это? Не вылезет ли каких-то подводных камней?) Или в данном случае лучше будет использовать метод advance (и, если да, то какой параметр нужно будет передавать во втором параметре)?
> 3:10 имя массива - єто указатель на его первый элемент а разве не ссылка (&) ? П.С. до сих пор путаюсь с & и * в С\С++ > 15:00 можно ли в цикле for написать как условие итератор i != NULL ? (типа как аналогия с указателями != nil)
Имя массива - это просто имя массива. К указателям не имеет никакого отношения. Вообще, даже просто формулировка некорректна из-за своей двусмысленности. Здесь будет уместна цитата Страуструпа: Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему. (ц) Страуструп
а как допустим применить функцию к объекту листа, вот допустим у меня содержатся в листе объекты класса персонажа, у которого есть функция движения, через массив можно написать arr[i].func(); а как в листе это сделать?
На самом деле этот итератор указывает не на последний элемент вектора, а на элемент за его пределом. Поэтому разыменовывать такой итератор нельзя. Поэтому там используется условие не равно !=
Вы пишите: *iterator = vector.end() будет указывать на последний элемент вектора* Нет, не будет. Не путайте итератор на последний элемент (rbegin) с итератором, который указывает позицию, за последним элементом (end)
@@Elemtro_Hiro выходит, несмотря на то что const_iterator... const, он всё равно позволяет работать с его позицией (изменять это значение), а const накладывается именно на доступ к данным контейнера через этот итератор
Сергей, спасибо за урок! Как всегда очень познавательно! Вопрос: если использовать Vector, не со встроенными типа, а пользовательскими, то почему в процессе работы Vector'а вызываются дополнительные деструкторы пользовательского типа с непонятными адресами (конструкторов с этими адресами не было)?
вызываться деструкторы будут при добавлении в вектор новых элементов, если в нем закончилось место. при этом все элементы которые там уже были будут перемещены/скопированы и на старых местах удалены деструктором пользовательского класса, собственно вот он и вызывается
Overdoses подозреваю, что Сергей до сих пор учит с++))). Язык настолько объёмный, что нужны годы практики на его изучение. По поводу изучения языка по видеоурокам, то на своём опыте скажу, что без регулярной практики всё забывается. Год уже как учу шарпы и о итераторах приза был.
у меня в голове каша, может кто поможет, класс iterator унаследован от класса const_iterator (как говорится в видео) или всё же наоборот и автор просто ошибся? а то получается что методы класса-наследника применимы к объектам базового класса (голова сейчас треснет), где я запутался?
подсел на видео автора )) не могу понять, как закомментировать выделенные строки. При комбинации клавиш Ctrl+K или Ctrl+U появляются лишь какие-то флажки возле строки
Здравствуйте , Сергей , вы сказали , что к элементам вектора можно обращаться через operator[] , но вот не задача , clang-tidy эту операцию очень ругает . Допустим у меня есть вектор пустой , и дальше его надо заполнить с клавиатуры for (int i = 0 ; i
Если у тебя вектор пустой то к нему нельзя обращаться через скобки, пытаясь добавить новый элемент тк получаешь ошибку сегментации памяти. Используй push_back (). Тут никакие итераторы не нужны.
Интересная хрень:: когда тренировался с итераторами, решил изменить capasity на векторе, так вот итератор не переопределился на новый вектор .... наверное не существует механизма для этого в принципе. Ещё: если использовать метод insert(it,number) и после этого продолжить работу с итератором it advance(it, 4) или mas.erace(it), то нихрена не выйдет, ... даже если выкрутить capasity, т.е. сам итератор ломается.
Это достаточно легко объясняется. Изменение capacity связано с переаллокацией буфера, т.е. вектор начинает располагаться в другом участке памяти. А вот итераторы продолжают указывать на старые ячейки, в которых лежат уже не принадлежащие нам данные. В случае метода insert, новый элемент вставляется перед тем, на который итератор указывал, соответственно данные итератор теперь не корректны. Примечательно так же, что неправильными становятся и все итераторы, указывавшие на эл-ты следующие за вставленным(т.к. их делегаты сдвинулись).
На место, которое располагается сразу за последним элементом. Это не "запасное место". Это вообще уже "чужая память". Поэтому, к этой памяти нельзя обращаться.
не удобны, эти ваши, итераторы... Индексы, как числа, своим видом в процессе чтения кода несут информацию, а итератор это литерал и на какой именно он элемент указывает просто из одной строчки кода понять будет нелегко, придётся "рыть" вглубь.
@@GorgeousPuree итератор - паттерн, смысл которого: один и тот же код может пробежаться по элементам самых разных контейнеров, ничего не зная о деталях реализации их устройства. Другими словами, область примененеия итераторов - обобщенный код; ситуации, когда отсутствует конкретика, и заранее не известно, что именно прилетит в функцию: массив, или какой нибудь std::list, например.
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
Этот канал просто золотая находка для любого, кто изучает программирование.
Крутые, подробные и понятные объяснения.
Не понимаю, почему у некоторых посредственных ютуберов, которые обучают программированию, невероятно большая аудитория, а этого канала так мало - несправедливо
Благодарю за поддержку!
Спасибо Сергей продолжайте в том же духе ваши уроки на вес золота 🥇.
Пожалуйста!
Не торопитесь пожалуйста переходить на c# а доучите нас до конца то есть что вы запланировали на c++ (хотелось бы и затронуть оконные приложения на c++ так же подробно)
Обычно их не на с++ делают, а на си шарп. Но тоже хотелось бы глянуть гайд=)
А зачем вообще их совмещать? .NET вполне себе самодостаточная платформа.
Недавно наткнулся на канал, подписался после 2 урока.
Такого полезного контента по C++ я ещё не встречал.
Автору огромное Спасибо!
Пожалуйста!
Огромное спасибо за уроки! Отличная подача материала.
Заметил, что в плейлисте "Основы C++. Программирование для начинающих" этот урок стоит после урока по списку и после урока по ключевому слову auto, где уже активно упоминаются итераторы.
Огромное спасибо за Ваш труд! Благодаря вашему каналу смог начать изучать С++ самостоятельно и спустя некоторое время даже нашёл работу)
только С++ достаточно бьіло?
@@dentuso8 я при университете работаю, поэтому не требуется огромных знаний, хватило С++
@@IvanBaksheev Хотелось бы узнать, не сложно ли учиться и работать одновременно?
@@cnota69 вполне терпимо, если грамотно планировать время)
Спасибо, лучший канал по С++ и по программированию в целом!!
Урок отличный! Продолжайте, это замечательно когда есть такие уроки.
STL уроки очень интересные , сразу чуствую , другой уровень уже :)!!!
спасибо Сергей за отличный урок, очень интересно, при просмотре не возможно остановиться))
Спасибо за бесценный труд!)
Спасибо Вам большое! Все доступно и понятно!)))
Спасибо большое, доступно и понятно, хорошо объясняете есть последовательность в объяснении
Пожалуйста!
Самое понятное объяснение которое я нашел,спасибо лайк ставлю подписываюсь однозначно!
Хорошо раскрыта тема, спасибо!
Спасибо за урок, уважаемый Сергей.
Спасибо. Очень крутые уроки, изучаю с удовольствием!
Отличные уроки... Спасибо!
Спасибо!
спасибо брат очень бесценные уроки
Пожалуйста!
Хорош!! Давай-давай вперёд! Контент в кайф! Можно ещё? Вообще красавчик!!
Щиро дякую!
Спасибо за урок.
Спасибо за урок. Теперь понял, что при доступе к элементам контейнера через цикл for в его описании за ключевым словом auto скрывается объявление итератора. На других каналах этому внимания не уделяется, а для новичков такие вещи как раз важны.
наверно самый масштабный видеоуроки по с++ не с++ за час
гоша дударь аКа Всезнающий в шоке, ТАК МОЖНО ЧТО ЛИ БЫЛО???))
@@KK-gg8sk Ахахахах))))
Спасибо! Отличные уроки!
Отличные видео!
Это очень полезная тема для того чтобы работать со строками (string) на максималках
Отличный урок!
#итераторы #STL #SimpleCode #урокипрограммирования
Зачем нужны итераторы, если есть указатели и арифметика указателей ?
будут ли про паттерны проектирования на c++?
Так, а "итератор" чем вам не паттерн?
@@princessmary5556 я думаю, этот человек имел в виду именно GoF
@@Valiazerdes И часто вы вот так домысливаете за других? Вопрос риторический.
великолепный урок! благодарю! лайк
Класс! Спасибо за урок!
Огромное спасибо за эту уроки !!!!!
Огромное спасибо!
As usual, like it!
Спасибо за качественный контент
Спасибо вам огромное за уроки!!!
Спасибо, хорошие уроки, как всегда)))
Благодарю!
159й урок. Еще немного и финал. Урааа!!!
Да неплохо
Отлично@krazly677
Спасибо огромное!)
Спасибо за труды
Сергей, скажите, а паттерны собираетесь объяснять?
Как жизнь, Бро?
Спасибо, удачи в продвижении канала, симуляция вируса мне понравилась)
Большое Спасибо)
Спасибо за урок
Super!) Thank you
Работаю через VS2019 и при попытке выполнить код на 19:39 ( cbegin() и cend() ) получаею ошибку С2039. Почему так и как решить?
Разобрался.
Когда я просто приписал "с" к методам, следуя указаниям автора, то компилятор выдавал ошибку. Но когда я стер метод и написал его заново, ошибка пропала... Сначала выпал в осадок от такой ситуации, а потом случайно заметил, что при приписывании "с" методам я использовал кириллицу :) Совсем забыл, что для компилятора с на кириллице и на латинице - это разные символы.
@@viktor65366 😶... bro
Очень много информации, но урок очень полезный!!
Спасибо большое
Девушка которая играет в роблокс изучает с++? ого
Хм.. не нарушится ли логика, если контейнер будет, например, не интовым? Возможно ли будет делать инкримент для какого-либо другого типа данных? Т.е., даже если мы все int заменим на string, а потом в цикле for будем делать инкримент для нашего счётчика, удастся ли это? Не вылезет ли каких-то подводных камней?) Или в данном случае лучше будет использовать метод advance (и, если да, то какой параметр нужно будет передавать во втором параметре)?
Изменение типа данных учитывается.
> 3:10 имя массива - єто указатель на его первый элемент
а разве не ссылка (&) ?
П.С. до сих пор путаюсь с & и * в С\С++
> 15:00
можно ли в цикле for написать как условие итератор i != NULL ? (типа как аналогия с указателями != nil)
Имя массива - это просто имя массива. К указателям не имеет никакого отношения. Вообще, даже просто формулировка некорректна из-за своей двусмысленности. Здесь будет уместна цитата Страуструпа:
Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.
(ц) Страуструп
а как допустим применить функцию к объекту листа, вот допустим у меня содержатся в листе объекты класса персонажа, у которого есть функция движения, через массив можно написать arr[i].func(); а как в листе это сделать?
😊☝👍👍👍👍
14:28, Но при этом iterator = vector.end() будет указывать на последний элемент вектора
ну вообще то там нет присваивания
На самом деле этот итератор указывает не на последний элемент вектора, а на элемент за его пределом. Поэтому разыменовывать такой итератор нельзя. Поэтому там используется условие не равно !=
Просто операторы по-разному описаны
Вы пишите: *iterator = vector.end() будет указывать на последний элемент вектора* Нет, не будет. Не путайте итератор на последний элемент (rbegin) с итератором, который указывает позицию, за последним элементом (end)
А будут уроки по OpenGL?
Как const iterator i являясь константным будет увеличиваться в цикле for c помощью инкримента i++ ? Я не понял.
Дело в том, что инкримент не увеличивает сам итератор, а только меняет его позицию на +1
@@Elemtro_Hiro я уже не помню своего вопроса
@@Elemtro_Hiro выходит, несмотря на то что const_iterator... const, он всё равно позволяет работать с его позицией (изменять это значение), а const накладывается именно на доступ к данным контейнера через этот итератор
Добрый день! Не могу разобраться, возможно ли в vector записать информацию через cin ?
Сергей, спасибо за урок! Как всегда очень познавательно!
Вопрос: если использовать Vector, не со встроенными типа, а пользовательскими, то почему в процессе работы Vector'а вызываются дополнительные деструкторы пользовательского типа с непонятными адресами (конструкторов с этими адресами не было)?
что значит деструкторы с непонятными адресами?
вызываться деструкторы будут при добавлении в вектор новых элементов, если в нем закончилось место. при этом все элементы которые там уже были будут перемещены/скопированы и на старых местах удалены деструктором пользовательского класса, собственно вот он и вызывается
Спасииибо :333
Здравствуйте, Сергей! Один вопрос, а за сколько вы выучили с++ и как эффективно обучаться, по вашему методу? И спасибо за урок!
Overdoses подозреваю, что Сергей до сих пор учит с++))). Язык настолько объёмный, что нужны годы практики на его изучение. По поводу изучения языка по видеоурокам, то на своём опыте скажу, что без регулярной практики всё забывается. Год уже как учу шарпы и о итераторах приза был.
тож, на пример всё ясно, а заходишь в компилятор и не можешь реализовать
у меня в голове каша, может кто поможет, класс iterator унаследован от класса const_iterator (как говорится в видео) или всё же наоборот и автор просто ошибся? а то получается что методы класса-наследника применимы к объектам базового класса (голова сейчас треснет), где я запутался?
подсел на видео автора ))
не могу понять, как закомментировать выделенные строки. При комбинации клавиш Ctrl+K или Ctrl+U появляются лишь какие-то флажки возле строки
Вам следовало бы раньше рассказать про тип auto, которым можно было им заменять эту длиннющую запись vector::iterator :)
На языке с++ не существует типа auto. Ключевое слово auto, так и называется "keyword auto". Это никакой не тип.
Здравствуйте , Сергей , вы сказали , что к элементам вектора можно обращаться через operator[] , но вот не задача , clang-tidy эту операцию очень ругает .
Допустим у меня есть вектор пустой , и дальше его надо заполнить с клавиатуры for (int i = 0 ; i
Если у тебя вектор пустой то к нему нельзя обращаться через скобки, пытаясь добавить новый элемент тк получаешь ошибку сегментации памяти. Используй push_back (). Тут никакие итераторы не нужны.
спасибо
Спасибо вам Махмод Саборжанович Йсламбиков
Интересная хрень:: когда тренировался с итераторами, решил изменить capasity на векторе, так вот итератор не переопределился на новый вектор .... наверное не существует механизма для этого в принципе. Ещё: если использовать метод insert(it,number) и после этого продолжить работу с итератором it advance(it, 4) или mas.erace(it), то нихрена не выйдет, ... даже если выкрутить capasity, т.е. сам итератор ломается.
Это достаточно легко объясняется. Изменение capacity связано с переаллокацией буфера, т.е. вектор начинает располагаться в другом участке памяти. А вот итераторы продолжают указывать на старые ячейки, в которых лежат уже не принадлежащие нам данные. В случае метода insert, новый элемент вставляется перед тем, на который итератор указывал, соответственно данные итератор теперь не корректны. Примечательно так же, что неправильными становятся и все итераторы, указывавшие на эл-ты следующие за вставленным(т.к. их делегаты сдвинулись).
Как вывести значение итератора в textbox?
У меня вопрос , myVector.end указывает на запасное место?
На место, которое располагается сразу за последним элементом. Это не "запасное место". Это вообще уже "чужая память". Поэтому, к этой памяти нельзя обращаться.
можно еще вот так делать
MyVector.insert(it+3, 999);
не писать -> advance(it, 3);
проста класс
можно вот так- > MyVector.insert(it+3, 999);
не писать -> advance(it, 3);
Оператор "квадратные скобочки" почему так угарно звучит)))
Оператор индексации]]]
после такого придется подписаться
даже так работает
vector myVector = { 12,232,323,231 };
vector::iterator it= myVector.begin();
for(int i=0; i
Можно, конечно и так, но лучше вот так:
vector myVector = { 12,232,323,231 };
for (auto it=myVector.bebgin();it!=MyVector.end();++it)
cout
Dėkui
Жалко что не рассмотрены двумерные вектора
я 35 600 просмотр
не удобны, эти ваши, итераторы... Индексы, как числа, своим видом в процессе чтения кода несут информацию, а итератор это литерал и на какой именно он элемент указывает просто из одной строчки кода понять будет нелегко, придётся "рыть" вглубь.
мне тоже так кажется, непонятно существование этих итераторов... По крайней мере, если в конкретном случае можно реализовать массивом.
@@GorgeousPuree итератор - паттерн, смысл которого: один и тот же код может пробежаться по элементам самых разных контейнеров, ничего не зная о деталях реализации их устройства. Другими словами, область примененеия итераторов - обобщенный код; ситуации, когда отсутствует конкретика, и заранее не известно, что именно прилетит в функцию: массив, или какой нибудь std::list, например.
IiIukarno
Спасибо за урок.
Пожалуйста!
Спасибо!!!
спасибо
Спасибо за урок.
Спасибо!
спасибо
Спасибо
спасибо