Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Svec0 v0;






// vector (только) использует My_alloc, а string свой

// собственный аллокатор (аллокатор по умолчанию):

using svec1 = vector< string, My_alloc< string> >;

svec1 v1(My_alloc< string> {my_arena1});

// vector и string используют My_alloc:

using xstring = basic_string< char, char_traits< char>, My_alloc< char> >;

using svec2 = vector< xstring, scoped_allocator_adaptor< My_alloc< xstring> > >;

svec2 v2(scoped_allocator_adaptor< My_alloc< xstring> > {my_arena1});

// vector использует My_alloc и string использует My_string_alloc:

using xstring2 = basic_string< char, char_traits< char>, My_string_alloc< char> >;

using svec3 = vector< xstring2, scoped_allocator_adaptor< My_alloc< xstring>, My_string_alloc< char> > >;

svec3 v3(scoped_allocator_adaptor< My_alloc< xstring2>, My_string_alloc< char> > {my_arena1, my_string_arena});

 

Очевидно, что первая версия, svec0, будет использоваться наиболее часто, но для систем с серьезными ограничениями памяти другие версии (особенно svec2) могут быть очень важны. Использование нескольких typedef немного повысят читабельность кода, но к счастью, это не тот код, который вам придется писать каждый день. scoped_allocator_adapter2 является разновидностью scoped_allocator_adapter для случаев, когда используются разные кастомные аллокаторы.

См. также:

  • Standard: 20.8.5 Scoped allocator adaptor [allocator.adaptor]
  • Pablo Halpern: The Scoped Allocator Model (Rev 2). N2554=08-0064.

 

std:: array

array – это стандартный контейнер, определенный в < array>, который представляет собой последовательность фиксированного размера с возможностью случайного доступа к элементам. У него нет дополнительного расхода памяти для хранения элементов, память для элементов выделяется в куче, он может инициализироваться с помощью списка инициализации, знает свой размер (количество элементов), и не может быть неявным образом преобразован к указателю. Другими словами, этот класс очень похож на стандартный массив, но без его недостатков.

array< int, 6> a = { 1, 2, 3 };

a[3]=4;

// x равен 0 поскольку элементы по умолчанию

// инициализируются нулями

int x = a[5];

// ошибка: std:: array не может быть неявно преобразован к указателю

int* p1 = a;

// ok: получаем указатель на первый элемент

int* p2 = a.data();

Обратите внимание, что вы можете получить пустой array, однако определить его размер по списку инициализации не получится:

// ошибка: размер неизвестен/отсутствует

array< int> a3 = { 1, 2, 3 };

// ok: пустой массив

array< int, 0> a0;

// поведение не определено; не делайте этого

int* p = a0.data();

 

Стандартные возможности array делают его привлекательными при разработке встроенных систем (или аналогичного ПО, к которому предъявляются высокие требования по производительности и безопасности или же наложены ограничениями по использованию памяти. Это последовательный контейнер, поэтому он предоставляет типичный набор членов и функций (как, например, и класс vector):

template< class C> C:: value_type sum(const C& a)

{






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.