C++ Lectures at MIPT (in Russian). Lecture 1. Strings.

preview_player
Показать описание
Лекции в магистратуре МФТИ по C++ на русском языке. Первая лекция посвящена строкам. Рассматриваются различные оптимизации строк и основные проблемы их проектирования.

Лектор: Константин Владимиров
Дата лекции: 3 сентября 2019 года
Съёмка и монтаж: Дмитрий Рябцев

Предыдущая лекция: нет, это первая

Timeline:
00:00 Введение
02:00 Строки в языке C
15:40 Проблема безопасности C-строк
20:15 Класс для строк
42:00 Проблема статических константных строк
47:25 String view
51:40 COW строки
1:03:35 SSO строки
1:11:20 Шаблон класса строки
1:20:20 Обзор литературы

Errata:
1. Присвоение char* в const char* разумеется также является ошибкой
2. realloc даёт гарантии при уменьшении размера (впрочем он не даёт их при увеличении)
3. 48:40 в примере опечатка, реально обрезает до "trim m"
Рекомендации по теме
Комментарии
Автор

Невероятно талантливая и мастерская подача. Очень интересно смотреть и "учавствовать".

meshcheriakov
Автор

Невероятно крутые лекции, спасибо вам!

strakhov
Автор

Посмотрел на одном дыхании, спасибо за лекцию!

demonort
Автор

Необыкновенно интересная лекция! Спасибо большое!

iraboguslavsky
Автор

Один магистрант == одна проблема. (8:23)
Все таки лекторы умеют тонко пошутить над слушателями.
А так спасибо за материал.

mikhailizvin
Автор

Просто проходил мимо, в итоге посмотрел всю лекцию, очень интересно, спасибо!
Я бы добавил к информации о важное замечание, что строка, на которою она указывает, не заканчивается '\0' (валидным считается диапазон [data(); data() + size()) ), поэтому не стоит использовать её метод () так же как () у, передавая её в функции, который ожидают строки, оканчивающиеся на '\0'.Так же при объявлении параметров функций рекомендуют передавать без const &, просто как .

gacha-somi
Автор

Спасибо, весьма познавательно и полезно!

blmmprg
Автор

Константин, пара микро-опечаток на слайдах 7 и 8.
В коде используются строки "Hello, world" без восклицательного знака в конце, а на иллюстрациях в конце строк восклицательный знак есть.

qoukxsm
Автор

Я все еще не согласен, что const char* можно присвоить к char*, мы тогда потеряем константность данных, это не то же, что const int присвоить int-у, последнему эквивалентно [char*] = [char* const].

dimhazel
Автор

Спасибо за лекцию.
Только что столкнулся с SSO строками и невозможностью их перемещения без изменения указателя. Если бы не прослушал вашу лекцию пару месяцев так бы и не понял в чём причина.

uvash
Автор

Интересно было бы узнать:
1. По какому алгоритму вычисляется ёмкость строки, если заранее известен её размер (с сервака, скажем, прилетел, перед тем как прилетела сама строка)? Т.е. как сперва вычислить какой будет capacity, а потом решать, помещать String в мою маленькую, почти переполненную кучу, или лучше пока воздержаться\воспользоваться Си-строкой\сказать серваку, чтоб прислал только кусочек и т.д.
2. Сколько по умолчанию отъедает новый capacity, если предыдущий превышен? Под строку в куче выделяется новая память с переносом всей строки или может она там как-то фрагментируется, в виде двусвязного списка или xз как еще?
А за лекцию автору спасибо. Для начинающих в C++ самое оно.

test_bot
Автор

В примере с " trim me " опечатка, удаляется слишком много в конце, и получается "trim m". Должно быть:
- min(trimlst, vtrim.size()) - 1);

vwtfhls
Автор

Константин, здравствуйте !
-*- -*- -*- вопрос -*- -*- -*-
Корректно ли работать дальше с представлением строки (std::string_view) если const char * был возвращён из функции например?
Ведь будет совершенно корректно записать std::string_view str{"const_char_*"};
-*- -*- -*- код -*- -*- -*-
const char *getStr() {
return "const_char_*";
}

int main(int, char **) {
std::string_view str{getStr()};
std::cout << str << std::endl;
return 0;
}

mpjsgye
Автор

Спасибо, Константин! А как посмотреть предыдущие лекции?

Electronix
Автор

А что если константные строки сделать ref-counting, а мутабельные - как std::string? В мутабельных строках заодно можно увеличить буфер для small string optimization на размер счетчика ссылок. Наверняка такое уже где-то реализовано.

xsomniator
Автор

Не понял как static const string_view решает проблему heap indirection, которая возникает при static const string. string_view же тоже необходимо где-то хранить буфер, а значит она должна вызвать malloc, разве нет?

Laboratoriafozek
Автор

1:12:40 - "SZ = (sizeof(data) + 2*sizeof(size_t) + 31) / 32;"
По идее же должно как-то зависеть и от sizeof(CharT) ?

PetrPss
Автор

9:26 - этот код не скомпилируется в ISO С++, так как возвращаемый тип malloc - void*, то его надо явно скастить к типу char*. В Си не надо.

misana
Автор

А где субтитры? Titled in english, but there is no subtitles.

groovy_cyco
Автор

Что не так было бы с using std::string. Написано на слайде что специально typedef, комментария нет

ivandomnikov