Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

38. Взаимодействие интеллектуальных указателей (класс unique_ptr) и динамических массивов. Примеры использования.

Стандартный интеллектуальный указатель std::unique_ptr<> можно использовать для управления жизненным циклом динамического массива (см. [Josuttis]). Он имеет частичную специализацию для массивов, которая перегружает оператор [] вместо оператора -> и использует оператор delete[] в качестве удалителя по умолчанию. Вот пример:

int n = 100;

std::unique_ptr<int[]> aptr(new int[n]);

for (int i = 0; i < n; ++i)

{

aptr[i] = i;

}

Эта поддержка не является полноценной: не хранится информация о размере массива, соответственно, не поддерживается интерфейс стандартных контейнеров и диапазонный for. Такое использование std::unique_ptr<> не рекомендуется, вместо этого лучше использовать std::vector<>. Интеллектуальный указатель std::shared_ptr<> не имеет даже такой поддержки массивов и совсем не рекомендуется для работы с динамическими массивами.

39. Класс Allocator и специальные алгоритмы. Примеры использования.

Примеры:

---------------------------------------------------------------------------------------------------- int n=20; allocator<string>alloc;//объект, способный резервировать строки auto const р = alloc.allocate(n);//резервирует память для n незаполненных строк

---------------------------------------------------------------------------------------------------- auto q = p;//q указывает на следующий элемент после последнего созданного alloc.construct(q++);//*q - пустая строка 

alloc.construct(q++, 10, 'c');//*q - cccccccccc alloc.construct(q++, "hi");//*q - hi!

---------------------------------------------------------------------------------------------------- cout<<*p<<endl;//ok: использует оператор вывода класса string cout<<*q<<endl;//ошибка: q указывает на незаполненную память!

---------------------------------------------------------------------------------------------------- while (q != р) alloc.destroy(--q);//метод destroy() освободит фактически зарезервированные блоки памяти

---------------------------------------------------------------------------------------------------- alloc.deallocate(р, n);

----------------------------------------------------------------------------------------------------

40. Алгоритмы копирования и заполнения неинициализированной памяти. Примеры использования

Рассмотрим пример создания вектора целых чисел, который надо скопировать. Первую половину заполним копиями из исходного вектора, 2ю – конкретными значениями.

Алгоритм initialized_copy получает 3 итератора, 1 и 2 обозначают исх. Последовательность, а 3й – получателя, в который будут скопированы элементы. Итератор на значения должен обозначать незаполненную память, т.к. он создает элементы в своем получателе. Возвращает приращенный итератор назначения, т.е. указатель на следующий элемент после последнего заполненного.

Алгоритм uninitialized_fill_n получает указатель пункта назначения, количество заполняемых элементов и заполняемое значение.

vector<string>vi; allocator<string>alloc;//объект, способный резервировать строки

//зарезервировать вдвое больше элементов, чем хранения в vi

auto p = alloc.allocate(vi.size() * 2);

//создать элементы, начиная с р как копии элементов в vi

auto q = uninitialized_copy(vi.begin(), vi.end(), p);

//инициализировать остальные элементы значением "N/A"

uninitialized_fill_n(q, vi.size(), "N/A"); 

Тема 2: Обработка исключительных ситуация в языке С++