векторные постоянные и временные в C

#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:0025:58).

В двух словах, vector неизменяемый, его содержимое не может быть изменено, поэтому transient() создается представление копирования записи vector . Когда цикл изменяет переходный процесс, создается новая копия vector данных, которые цикл может свободно изменять по мере необходимости. А затем persistent() создает новый неизменяемый vector из данных переходного процесса.

Это рассматривается в некоторых более подробных разделах о временных структурах данных:

Временные структуры данных всегда создаются из существующих постоянных … структура данных…

Вы получаете временную «копию» структуры данных путем вызова transient . Это создает новую временную структуру данных, которая является копией источника и имеет те же характеристики производительности. На самом деле, это в основном структура исходных данных и подчеркивает первую особенность переходных процессов — создание одного из них — O (1) . Он разделяет структуру со своим источником, так же, как постоянные копии разделяют структуру.

Вторая особенность переходных процессов заключается в том, что их создание не изменяет источник, а источник не может быть изменен с помощью переходного процесса. Ваши исходные данные неизменны и постоянны, как всегда.

Когда вы закончите создавать свои результаты, вы можете создать постоянную структуру данных, вызвав persistent! переходный процесс. Эта операция также является O(1). После вызова persistent! переходный процесс не должен использоваться, и все операции будут генерировать исключения. Это будет справедливо и для любых псевдонимов, которые вы могли создать.