std :: allocator () в C ++ с примерами

Опубликовано: 30 Декабря, 2021

Распределители - это объекты, отвечающие за инкапсуляцию управления памятью. std :: allocator используется, когда вы хотите разделить выделение и выполнить построение в два этапа. Он также используется, когда раздельное уничтожение и освобождение выполняется в два этапа.

Все контейнеры STL в C ++ имеют параметр типа Allocator, который по умолчанию равен std :: allocator . Распределитель по умолчанию просто использует операторы new и delete для получения и освобождения памяти.

Декларация:

 распределитель классов template <class T>;

Функции-члены, связанные с std :: allocator ():

  1. адрес: используется для получения адреса объекта, хотя он удален в C ++ 20.
  2. construct: он используется для создания объекта. Он также удален в C ++ 20.
  3. destroy: он используется для уничтожения объекта в выделенном хранилище. Он также удален в C ++ 20.
  4. max_size: возвращает наибольший поддерживаемый размер выделения. Он устарел в C ++ 17 и удален в
    С ++ 20.
  5. allocate: используется для выделения памяти.
  6. deallocate: используется для освобождения памяти.

Нижеприведенные программы иллюстрируют вышеупомянутую функцию:

Программа 1:

// C++ program for illustration
// of std::allocator() function
#include <iostream>
#include <memory>
using namespace std;
int main()
{
// allocator for integer values
allocator< int > myAllocator;
// allocate space for five ints
int * arr = myAllocator.allocate(5);
// construct arr[0] and arr[3]
myAllocator.construct(arr, 100);
arr[3] = 10;
cout << arr[3] << endl;
cout << arr[0] << endl;
// deallocate space for five ints
myAllocator.deallocate(arr, 5);
return 0;
}
Выход:
10
100

Программа 2:

// C++ program for illustration
// of std::allocator() function
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main()
{
// allocator for string values
allocator<string> myAllocator;
// allocate space for three strings
string* str = myAllocator.allocate(3);
// construct these 3 strings
myAllocator.construct(str, "Geeks" );
myAllocator.construct(str + 1, "for" );
myAllocator.construct(str + 2, "Geeks" );
cout << str[0] << str[1] << str[2];
// destroy these 3 strings
myAllocator.destroy(str);
myAllocator.destroy(str + 1);
myAllocator.destroy(str + 2);
// deallocate space for 3 strings
myAllocator.deallocate(str, 3);
}
Выход:
GeeksforGeeks

Преимущество использования std :: allocator

  1. распределитель - это распределитель памяти для контейнеров STL. Этот контейнер может отделить выделение и освобождение памяти от инициализации и уничтожения их элементов. Следовательно, вызов vec.reserve (n) вектора vec выделяет только память как минимум для n элементов. Конструктор для каждого элемента выполняться не будет.
  2. распределитель можно настроить в соответствии с контейнером, который вам нужен, например, вектор, который вы хотите выделять только время от времени.
  3. Напротив, new не позволяет контролировать, какие конструкторы вызываются, и просто создавать все объекты одновременно. Это преимущество std :: allocator перед новым
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++