std.container.array
Этот модуль предоставляет тип Array с детерминированным использованием памяти, не зависящим от сборщика мусора, как альтернативу встроенным массивам.
Этот модуль является подмодулем std.container.
- Источник
- std/container/array.d
- Лицензия:
- Распространяется по лицензии Boost Software License, версия 1.0. (См. прилагаемый файл LICENSE_1_0.txt или копию по адресу boost.org/LICENSE_1_0.txt).
- Авторы:
- Андрей Александреску
- Примеры:
-
auto arr = Array!int(0, 2, 3); writeln(arr[0]); // 0 writeln(arr.front); // 0 writeln(arr.back); // 3 // reserve space arr.reserve(1000); writeln(arr.length); // 3 assert(arr.capacity >= 1000); // insertion arr.insertBefore(arr[1..$], 1); writeln(arr.front); // 0 writeln(arr.length); // 4 arr.insertBack(4); writeln(arr.back); // 4 writeln(arr.length); // 5 // set elements arr[1] *= 42; writeln(arr[1]); // 42
- Примеры:
-
import std.algorithm.comparison : equal; auto arr = Array!int(1, 2, 3); // concat auto b = Array!int(11, 12, 13); arr ~= b; writeln(arr.length); // 6 // slicing assert(arr[1 .. 3].equal([2, 3])); // remove arr.linearRemove(arr[1 .. 3]); assert(arr[0 .. 2].equal([1, 11]));
- Примеры:
-
Array!boolэффективно объединяет значения, выделяя по одному биту на элементArray!bool arr; arr.insert([true, true, false, true, false]); writeln(arr.length); // 5
- struct Array(T) if (!is(immutable(T) == immutable(bool)));
-
Тип массива с детерминированным управлением памятью. Память, выделенная для массива, освобождается как можно скорее; она не зависит от сборщика мусора.
Arrayиспользуетmalloc,reallocиfreeдля управления собственной памятью.Это означает, что указатели на элементы
Arrayстанут висящими, как только элемент будет удален изArray. С другой стороны, память, выделеннаяArray, будет просматриваться сборщиком мусора, а объекты, управляемые сборщиком мусора, на которые ссылаетсяArray, будут поддерживаться живыми.- Примечание
- При использовании
Arrayс функциями на основе диапазонов, такими как те, что вstd.algorithm,Arrayнеобходимо разбить на диапазоны (например, использоватьarray[].map!вместоarray.map!). Сам контейнер не является диапазоном.
- Примеры:
- typeof может дать неправильный результат в случае классов, определяющих оператор
opCallhttps://issues.dlang.org/show_bug.cgi?id=20589 деструктор std.container.array.Array!(MyClass).Array.~this имеет @system, поэтому юнит-тест тоже должен быть @systemclass MyClass { T opCall(T)(T p) { return p; } } Array!MyClass arr;
- this(U)(U[] values...)
Constraints: if (isImplicitlyConvertible!(U, T)); -
Конструктор, принимающий несколько элементов.
- this(Range)(Range r)
Constraints: if (isInputRange!Range && isImplicitlyConvertible!(ElementType!Range, T) && !is(Range == T[])); -
Конструктор, принимающий диапазон входных данных.
- const bool opEquals(const Array rhs);
const bool opEquals(ref const Array rhs); -
Сравнение на равенство.
- alias Range = RangeT!Array;
alias ConstRange = RangeT!(const(Array));
alias ImmutableRange = RangeT!(immutable(Array)); -
Определяет основной диапазон массива, который является диапазоном с произвольным доступом.
ConstRange— это вариант сconstэлементами.ImmutableRange— это вариант сimmutableэлементами. - @property Array dup();
-
Создаёт дубликат массива. Элементы сами не дублируются транзитивно.
- Сложность
- Ο(
length).
- const @property bool empty();
-
- Возвращает:
-
trueтогда и только тогда, когда массив не содержит элементов.
- Сложность
- Ο(
1)
- const @property size_t length();
const size_t opDollar(); -
- Возвращает:
- Количество элементов в массиве.
- Сложность
- Ο(
1).
- @property size_t capacity();
-
- Возвращает:
- Максимальное количество элементов, которое массив может хранить без перераспределения памяти и аннулирования итераторов при вставке.
- Сложность
- Ο(
1)
- void reserve(size_t elements);
-
Обеспечивает достаточную ёмкость для размещения
eэлементов. Еслиe < capacity, этот метод ничего не делает.- Постусловие
-
capacity >= e
- Примечание
- Если ёмкость увеличивается, следует предположить, что все итераторы на элементы аннулируются.
- Сложность
- не более Ο(
length) еслиe > capacity, иначе Ο(1).
- Range opSlice();
-
- Возвращает:
- Диапазон, который итерирует по элементам массива в прямом порядке.
- Сложность
- Ο(
1)
- Range opSlice(size_t i, size_t j);
-
- Возвращает:
- Диапазон, который итерирует по элементам массива с индекса
iдо (исключая) индексаj.
- Предварительное условие
-
i <= j && j <= length
- Сложность
- Ο(
1)
- inout @property ref inout(T) front();
-
- Возвращает:
- Первый элемент массива.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1)
- inout @property ref inout(T) back();
-
- Возвращает:
- Последний элемент массива.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1)
- inout ref inout(T) opIndex(size_t i);
-
- Возвращает:
- Элемент или ссылку на элемент по указанному индексу.
- Предварительное условие
-
i < length
- Сложность
- Ο(
1)
- void opSliceAssign(T value);
void opSliceAssign(T value, size_t i, size_t j);
void opSliceUnary(string op)()
Constraints: if (op == "++" || op == "--");
void opSliceUnary(string op)(size_t i, size_t j)
Constraints: if (op == "++" || op == "--");
void opSliceOpAssign(string op)(T value);
void opSliceOpAssign(string op)(T value, size_t i, size_t j); -
Операторы срезов, выполняющие указанную операцию над всем слайсом.
- Предварительное условие
-
i < j && j < length
- Сложность
- Ο(
slice.length)
- Array opBinary(string op, Stuff)(Stuff stuff)
Constraints: if (op == "~"); -
- Возвращает:
- Новый массив, являющийся конкатенацией
thisи его аргумента.
- Сложность
- Ο(
length + m), гдеm— количество элементов вstuff.
- void opOpAssign(string op, Stuff)(auto ref Stuff stuff)
Constraints: if (op == "~"); -
Перенаправляет к
insertBack. - void clear();
-
Удаляет все элементы из массива и освобождает выделенную память.
- Постусловие
-
empty == true && capacity == 0
- Сложность
- Ο(
length)
- @property void length(size_t newLength);
-
Устанавливает количество элементов в массиве на
newLength. ЕслиnewLengthбольше, чемlength, новые элементы добавляются в конец массива и инициализируютсяT.init.- Сложность
- Гарантированно Ο(
abs(length - newLength)) еслиcapacity >= newLength. Еслиcapacity < newLengthнаихудший случай — Ο(newLength).
- Постусловие
-
length == newLength
- T removeAny();
alias stableRemoveAny = removeAny; -
Удаляет последний элемент из массива и возвращает его. Стабильная и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не аннулируются.
- Предварительное условие
-
empty == false
- Возвращает:
- Удаленный элемент.
- Сложность
- Ο(
1).
- Выбрасывает:
-
Exceptionесли массив пуст.
- size_t insertBack(Stuff)(Stuff stuff)
Constraints: if (isImplicitlyConvertible!(Stuff, T) || isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, T));
alias insert = insertBack; -
Вставляет указанные элементы в конец массива.
stuffможет быть значением, преобразуемым вTили диапазоном объектов, преобразуемых вT.- Возвращает:
- Количество вставленных элементов.
- Сложность
- Ο(
length + m) если происходит перераспределение, иначе Ο(m), гдеm— количество элементов вstuff.
- void removeBack();
alias stableRemoveBack = removeBack; -
Удаляет значение из конца массива. Стабильная и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не аннулируются.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1).
- Выбрасывает:
-
Exceptionесли массив пуст.
- size_t removeBack(size_t howMany);
alias stableRemoveBack = removeBack; -
Удаляет
howManyзначений из конца массива. В отличие от предыдущих версий, эти функции не выбрасывают исключение, если не удалось удалитьhowManyэлементов. Вместо этого, еслиhowMany > n, все элементы удаляются. Возвращаемое значение — эффективное количество удаленных элементов. Стабильная и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не аннулируются.- Возвращает:
- Количество удаленных элементов.
- Сложность
- Ο(
howMany).
- size_t insertBefore(Stuff)(Range r, Stuff stuff)
Constraints: if (isImplicitlyConvertible!(Stuff, T));
size_t insertBefore(Stuff)(Range r, Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, T));
alias stableInsertBefore = insertBefore;
size_t insertAfter(Stuff)(Range r, Stuff stuff);
size_t replace(Stuff)(Range r, Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, T));
size_t replace(Stuff)(Range r, Stuff stuff)
Constraints: if (isImplicitlyConvertible!(Stuff, T));
- this(U)(U[] values...)
-
Вставляет
stuffперед, после или вместо диапазонr, который должен быть допустимым диапазоном, извлечённым ранее из этого массива.stuffможет быть значением, преобразуемым вTили диапазоном объектов, преобразуемых вT. И стабильная, и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие массив, никогда не становятся недействительными.- Возвращает:
- Количество вставленных значений.
- Сложность
- Ο(
length + m), гдеm— длинаstuff.
- Выбрасывает:
-
Exceptionеслиrне является диапазоном, извлечённым из этого массива.
- Диапазон linearRemove(Range r);
-
Удаляет все элементы, принадлежащие
r, которое должно быть диапазоном, полученным изначально из этого массива.- Возвращает:
- Диапазон, охватывающий оставшиеся элементы в массиве, которые изначально находились сразу после
r.
- Сложность
- Ο(
length)
- Выбрасывает:
-
Exceptionеслиrне является допустимым диапазоном, извлечённым из этого массива.
-
- структура Array(T) если (is(immutable(T) == immutable(bool)));
-
Массив, специализированный для
bool. Эффективно упаковывает значения, выделяя один бит на элемент.- struct Диапазон;
-
Определяет основной диапазон массива.
- @property Диапазон save();
@property bool пустой();
@property T первый();
@property void первый(bool value);
T переместитьВперед();
void удалитьСпереди();
@property T последний();
@property void последний(bool value);
T переместитьНазад();
void удалитьСзади();
T индекс(size_t i);
void присвоитьИндекс(T value, size_t i);
T переместитьВ(size_t i);
const @property size_t длина();
Диапазон срез(size_t low, size_t high); -
Примитивы диапазона
- @property Диапазон save();
- @property bool пустой();
-
Свойство, возвращающее
trueтогда и только тогда, когда массив не содержит элементов.- Сложность
- Ο(
1)
- @property Array копия();
-
- Возвращает:
- Копию массива.
- Сложность
- Ο(
length).
- const @property size_t длина();
-
Возвращает количество элементов в массиве.
- Сложность
- Ο(
1).
- @property size_t емкость();
-
- Возвращает:
- Максимальное количество элементов, которое массив может хранить без перераспределения памяти и инвалидации итераторов при вставке.
- Сложность
- Ο(
1).
- void зарезервировать(size_t e);
-
Обеспечивает достаточную емкость для размещения
eэлементов. Еслиe < capacity, этот метод ничего не делает.- Постусловие
-
capacity >= e
- Примечание
- Если емкость увеличивается, все итераторы элементов считаются недействительными.
- Сложность
- не более Ο(
length) еслиe > capacity, иначе Ο(1).
- Диапазон срез();
-
- Возвращает:
- Диапазон, который перебирает все элементы массива в прямом порядке.
- Сложность
- Ο(
1)
- Диапазон срез(size_t a, size_t b);
-
- Возвращает:
- Диапазон, который итерирует по массиву между двумя заданными позициями.
- Сложность
- Ο(
1)
- @property bool первый();
@property void первый(bool value); -
- Возвращает:
- Первый элемент массива.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1)
- Выбрасывает:
-
Exceptionесли массив пуст.
- @property bool последний();
@property void последний(bool value); -
- Возвращает:
- Последний элемент массива.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1)
- Выбрасывает:
-
Exceptionесли массив пуст.
- bool индекс(size_t i);
void присвоитьИндекс(bool value, size_t i);
void индексОперацияПрисвоения(string op)(bool value, size_t i);
T переместитьВ(size_t i); -
Операторы индексирования, возвращающие или изменяющие значение по указанному индексу.
- Предварительное условие
-
i < length
- Сложность
- Ο(
1)
- Array!bool бинарнаяОперация(string op, Stuff)(Stuff rhs)
Constraints: if (op == "~"); -
- Возвращает:
- Новый массив, который является конкатенацией
thisи его аргумента.
- Сложность
- Ο(
length + m), гдеm- количество элементов вstuff.
- Array!bool операцияПрисвоения(string op, Stuff)(Stuff stuff)
Constraints: if (op == "~"); -
Перенаправляет на
insertBack. - void очистить();
-
Удаляет все элементы из массива и освобождает выделенную память.
- Постусловие
-
empty == true && capacity == 0
- Сложность
- Ο(
length)
- @property void длина(size_t newLength);
-
Устанавливает количество элементов в массиве на
newLength. ЕслиnewLengthбольшеlength, новые элементы добавляются в конец массива и инициализируются значениемfalse.- Сложность
- Гарантированно Ο(
abs(length - newLength)) еслиcapacity >= newLength. Еслиcapacity < newLength, худший случай - Ο(newLength).
- Постусловие
-
length == newLength
- T удалитьЛюбой();
alias стабильноеУдалитьЛюбой = removeAny; -
Удаляет последний элемент из массива и возвращает его. Стабильная и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не станут недействительными.
- Предварительное условие
-
empty == false
- Возвращает:
- Удалённый элемент.
- Сложность
- Ο(
1).
- Выбрасывает:
-
Exceptionесли массив пуст.
- size_t вставитьСзади(Stuff)(Stuff stuff)
Constraints: if (is(Stuff : bool));
size_t вставитьСзади(Stuff)(Stuff stuff)
Constraints: if (isInputRange!Stuff && is(ElementType!Stuff : bool));
alias стабильнаяВставкаСзади = insertBack;
alias вставить = insertBack;
alias стабильнаяВставка = insertBack;
alias линейнаяВставка = insertBack;
alias стабильнаяЛинейнаяВставка = insertBack; -
Вставляет указанные элементы в конец массива.
stuffможет быть значением, преобразуемым вboolили диапазоном объектов, преобразуемых вbool.- Возвращает:
- Количество вставленных элементов.
- Сложность
- Ο(
length + m) если происходит перераспределение, иначе Ο(m), гдеm- количество элементов вstuff.
- void удалитьСзади();
alias стабильноеУдалитьСзади = removeBack; -
Удаляет значение из конца массива. Обе версии, стабильная и нестабильная, ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не станут недействительными.
- Предварительное условие
-
empty == false
- Сложность
- Ο(
1).
- Выбрасывает:
-
Exceptionесли массив пуст.
- size_t удалитьСзади(size_t howMany);
alias стабильноеУдалитьСзади = removeBack; -
Удаляет
howManyзначений с конца массива. В отличие от непараметризованных версий выше, эти функции не выбрасывают исключения, если не смогли удалитьhowManyэлементов. Вместо этого, еслиhowMany > n, удаляются все элементы. Возвращаемое значение - эффективное количество удалённых элементов. Стабильная и нестабильная версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не станут недействительными.- Возвращает:
- Количество удалённых элементов.
- Сложность
- Ο(
howMany).
- size_t вставитьПеред(Stuff)(Range r, Stuff stuff);
alias стабильнаяВставкаПеред = insertBefore;
size_t вставитьПосле(Stuff)(Range r, Stuff stuff);
alias стабильнаяВставкаПосле = insertAfter;
size_t заменить(Stuff)(Range r, Stuff stuff)
Constraints: if (is(Stuff : bool));
alias стабильнаяЗамена = replace;
-
Вставляет
stuffперед, после или вместо диапазонаr, который должен быть допустимым диапазоном, предварительно извлечённым из этого массива.stuffможет быть значением, преобразуемым вboolили диапазоном объектов, преобразуемых вbool. Как стабильные, так и нестабильные версии ведут себя одинаково и гарантируют, что диапазоны, итерирующие по массиву, никогда не станут недействительными.- Возвращает:
- Количество вставленных значений.
- Сложность
- Ο(
length + m), гдеm— длинаstuff.
- Диапазон linearRemove(Диапазон r);
-
Удаляет все элементы, принадлежащие
r, который должен быть диапазоном, изначально полученным из этого массива.- Возвращает:
- Диапазон, охватывающий оставшиеся элементы в массиве, которые первоначально находились сразу после
r.
- Сложность
- Ο(
length)
-
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_container_array.html