В предыдущем видео мы познакомились с функцией move и рассмотрели ее на примере функции, которая читает данные из потока и складывает строчки в вектор. И там нам пригодилась функция move, чтобы просто строчку лишний раз в вектор не копировать, чтобы ее туда переместить. Этот пример вам мог показаться не очень убедительным и не очень общим — казалось бы, мы просто читаем строчки и всё. Ограничивается ли этим примером область применения функции move? На самом деле нет. Вспомните, что ранее в нашем курсе мы рассматривали функцию разбиения на слова. Мы там поняли, что здорово, когда она возвращает string view, а не строчки. И тем самым мы ее ускорили. Но тем не менее бывают ситуации, когда результат вызова этой функции должен жить дольше, чем исходная строка. И тогда все-таки нужно возвращать из нее строчки, а не string view. И вот в этом варианте функции SplitIntoWords, которую мы сейчас реализуем — вот функция SplitIntoWords, которая принимает строчку и возвращает вектор строк, в этом варианте тоже может попасться и случайно сделать лишнее копирование. Итак, давайте реализуем функцию SplitIntoWord некоторым довольно необычным образом, но тем не менее вполне валидным, а именно мы, конечно, создадим вектор строк, который назовем words, который мы в конце функции вернем. И как мы будем этот вектор набирать? Мы будем поддерживать некоторое текущее слово. Далее мы будем перебирать все символы нашей исходной строки циклом for. И для каждого очередного символа проверять, является ли он пробелом. Если он является пробелом, значит то, что мы сейчас накопили в переменной current_word нужно сохранить, скинуть в наш текущий вектор. И это можно было бы сделать вот: words.push_back от current_word. И теперь наше слово нужно как бы обнулить, очистить, потому что с этим словом все покончено уже. Дальше мы будем набирать новое слово. Если же наш символ не пробел, тогда нужно просто его дописать к текущему слову с помощью метода push_back у строки. И, конечно, в конце у нас тоже есть некоторое текущее слово. Если последний символ не пробел, то мы его не скинем. Поэтому давайте еще в конце напишем words.push_back(current_word). Вот у нас получилась нормальная функция SplitIntoWords, давайте ее проверим на каком-нибудь простом примере. Давайте скажем, я вызову эту функцию от какой-нибудь строки: SplitIntoWords ("Red belt C++"). И переберу все слова, которые получились, которые вернулись из функции SplitIntoWords. И это слова выведу, разделив переводом строки. Давайте я проверю, что я написал что-то разумное и оно, вообще, работает. Код компилируется, код запустился. И я вижу вот три слова: Red, belt и C++. А теперь давайте внимательно посмотрим на этот код и увидим, где же в нем происходит лишнее копирование. У нас здесь единственные тяжелый push_back, когда мы добавляем строчку в вектор строк. И вот здесь мы вызываем push_back от некоторой переменной current_word, которая нам явно потом не нужна. Она даже очищается на следующей же строке. Зачем нам здесь, честно, копировать данные этого объекта? Ответ: незачем. Давайте мы обернем эту переменную current_word в функцию move. И теперь здесь не будет происходить копирования, а код продолжит работать: Red, belt, C++. Можно заметить, что мы уже видели в предыдущем видео, что после перемещения из переменной она, как правило, остается пустой. Поэтому, в принципе, вот этот вызов метода clear здесь не очень нужен, но можно для надежности его оставить — все равно он дополнительных ресурсов не потребует. Итак, мы рассмотрели еще один пример применения функции move. И давайте резюмировать, что мы про нее узнали. Функция move позволяет инициировать перемещение вместо копирования для постоянного объекта. При этом, по сути, она сама ничего не перемещает, она изменяет семантику текущего объекта так, чтобы он вел себя, как будто это временный объект. И, например, метод push_back думал, что это временный объект и данные у него можно легко и быстро забрать. При этом мы заметили. что, как правило, после перемещения объект остается пустым, что в частности можно использовать как знак того, как способ определить, что из объекта случилось перемещение.