#c #vector #stl #c 14
#c #вектор #stl #c 14
Вопрос:
Может кто-нибудь помочь мне понять этот код?
Что здесь transient()
и persistent()
делает?
Ссылка:
CppCon 2017: Хуан Педро Боливар Пуэнте, «Постмодернистские неизменяемые структуры данных»
Временная метка:
19:03
vector<int> myitoa(vector<int> v, int first, int last)
{
auto t = v.transient();
for (auto i = first; i < last; i)
t.push_back(i);
return t.persistent();
}
Более того, когда я его скомпилировал, я получил сообщение об ошибке:
‘class std::vector’ не имеет члена с именем ‘transient’
Требуется какой-либо конкретный файл заголовка?
Комментарии:
1. Я думаю, что это может быть концептуальный будущий код. У текущих
vector
s нетtransient
persistent
метода-члена or.
Ответ №1:
vector
в данном случае это not std::vector
, который не transient()
persistent()
имеет методов or, как указано в ошибке компилятора. На самом деле это immer::vector
, как утверждает Хуан в 18:06:
Итак, я использую
immer
пространство имен везде здесь. Ничто не являетсяstd
векторным. Это неизменяемый вектор …
Если вы внимательно слушаете видео, Хуан объясняет, ЧТО transient()
persistent()
на самом деле делают и ПОЧЕМУ (19:00 — 25:58).
В двух словах, vector
неизменяемый, его содержимое не может быть изменено, поэтому transient()
создается представление копирования записи vector
. Когда цикл изменяет переходный процесс, создается новая копия vector
данных, которые цикл может свободно изменять по мере необходимости. А затем persistent()
создает новый неизменяемый vector
из данных переходного процесса.
Это рассматривается в некоторых более подробных разделах о временных структурах данных:
Временные структуры данных всегда создаются из существующих постоянных … структура данных…
Вы получаете временную «копию» структуры данных путем вызова
transient
. Это создает новую временную структуру данных, которая является копией источника и имеет те же характеристики производительности. На самом деле, это в основном структура исходных данных и подчеркивает первую особенность переходных процессов — создание одного из них — O (1) . Он разделяет структуру со своим источником, так же, как постоянные копии разделяют структуру.Вторая особенность переходных процессов заключается в том, что их создание не изменяет источник, а источник не может быть изменен с помощью переходного процесса. Ваши исходные данные неизменны и постоянны, как всегда.
…
Когда вы закончите создавать свои результаты, вы можете создать постоянную структуру данных, вызвав
persistent!
переходный процесс. Эта операция также является O(1). После вызоваpersistent!
переходный процесс не должен использоваться, и все операции будут генерировать исключения. Это будет справедливо и для любых псевдонимов, которые вы могли создать.