std :: allocator () в C ++ с примерами
Опубликовано: 30 Декабря, 2021
Распределители - это объекты, отвечающие за инкапсуляцию управления памятью. std :: allocator используется, когда вы хотите разделить выделение и выполнить построение в два этапа. Он также используется, когда раздельное уничтожение и освобождение выполняется в два этапа.
Все контейнеры STL в C ++ имеют параметр типа Allocator, который по умолчанию равен std :: allocator . Распределитель по умолчанию просто использует операторы new и delete для получения и освобождения памяти.
Декларация:
распределитель классов template <class T>;
Функции-члены, связанные с std :: allocator ():
- адрес: используется для получения адреса объекта, хотя он удален в C ++ 20.
- construct: он используется для создания объекта. Он также удален в C ++ 20.
- destroy: он используется для уничтожения объекта в выделенном хранилище. Он также удален в C ++ 20.
- max_size: возвращает наибольший поддерживаемый размер выделения. Он устарел в C ++ 17 и удален в
С ++ 20. - allocate: используется для выделения памяти.
- 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
- распределитель - это распределитель памяти для контейнеров STL. Этот контейнер может отделить выделение и освобождение памяти от инициализации и уничтожения их элементов. Следовательно, вызов vec.reserve (n) вектора vec выделяет только память как минимум для n элементов. Конструктор для каждого элемента выполняться не будет.
- распределитель можно настроить в соответствии с контейнером, который вам нужен, например, вектор, который вы хотите выделять только время от времени.
- Напротив, new не позволяет контролировать, какие конструкторы вызываются, и просто создавать все объекты одновременно. Это преимущество std :: allocator перед новым
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .