Магистерский курс C++ (МФТИ, 2022-2023). Лекция 14. Диапазоны, часть 2

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

Вторая часть лекции про диапазоны сосредоточена вокруг pull model и того как работают более сложные -- фильтрующие, трансформирующие и тому подобные отображения. Мы также разберем как писать собственные адаптеры и не оставим без внимания интересный пример как переиспользовать существующие.

Лектор: Константин Владимиров.
Дата лекции: 14 декабря 2022 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Внутри трансформа
09:40 Провисания и borrow checking
22:20 Неуверенное поведение
25:20 Внутри фильтра и const-итерируемость
35:25 Комбинируемость
38:45 Pull model
48:20 Собственный адаптер
01:01:20 Тримминг Бриндла
01:08:03 Завершение и обзор литературы
01:16:20 Бонус: простые числа
01:33:08 Выводы и титры

Errata:
* 1:20:05 parameter и return type могут быть неполными даже при использовании по значению в объявлении функции, главное чтобы они были определены к моменту, когда будет нужно определение функции. Пример см. в комментариях.
Рекомендации по теме
Комментарии
Автор

Необычное ощущение, почему-то стало жалко, что не получится попасть на зачёт к Константину!)

goglom
Автор

спасибо большое за ваши труды, лекция как всегда восхитительна!

sigasigasiga
Автор

Когда начались диапазоны, вообще перестал понимать что-либо. Слишком глубоко уходим в абстракцию C++. Печалька. Наверно, здесь только нужно встретиться с этими вещами и практиковаться

dmitrydemis
Автор

Спасибо,

Теперь понятно почему AAA с const в моих pipe не работал, хотя для протокола, я расстроен😃

DrUlrih
Автор

47:32
Ну кстати msvc довольно строг ко многим ошибкам ввода на уровне ассерта (_STL_VERIFY). Ругает и за декремент begin'a, и за инкремент end'а, однажды даже в std::clamp поругал за то что аргументы не в том порядке передал, хотя по стандарту это UB.

danielkeehl
Автор

1:20:05 Это не так, parameter и return type могут быть неполными даже при использовании по значению в объявлении функции, главное чтобы они были определены к моменту, когда будет нужно определение функции. См. CWG-1824 и CWG-2430. Простой контрпример
struct S {
static S create() { return {}; } // incomplete
S &operator= (S s) {} // incomplete
};

Более того, поскольку класс шаблонный, и функции будут инстанцироваться по запросу, можно написать определение функций прямо на месте
iterator begin() {
return iterator{*this};
}
sentinel end() {
return sentinel{ranges::end(snd_)};
}

P.S. Возможно, интересный пример
struct S {
class C;

C foo() { return {}; }

class C {}; // ok
};

// class S::C {}; // too late, return type is incomplete

ddvamp
Автор

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

andreysolovyev
Автор

1:12:00 ну вот как мне думается, то вьюшки не предполагались к использованию многократно для действий -- одна вьюшка, одно действие. Однако возникает вопрос -- почему тогда не сделано подобие "закупоривания" ентой "отработавшей" вьюшки после произведения над ней действий.

safocl
Автор

43:35 я так понимаю, на слайде опечатка и имелась в виду итерация не по vf, а по v? ведь после первого цикла второй, по идее, просто не выполнится, ведь в векторе больше нет нечётных элементов, ибо все они были увеличены на 1

sigasigasiga
Автор

Большое Вам спасибо за полезные лекции! Можете подсказать, а есть ли к Вашим лекциям задачки? Как я понимаю, студенты делают в командах тот большой проект и сдают в итоге его. А есть ли может быть либо более мелкие задачи?
Либо должно быть достаточно просмотра лекций и полезных ссылок на статьи и конференции?

facker
Автор

1:30:06 я так понимаю, using pointer вы не указали преднамеренно — ваш любимый капкан по какой-то причине не сработал :)

sigasigasiga