Переместиться к: Array
Исходный код: std/container/array.d
auto arr = Array!int(0, 2, 3); assert(arr[0] == 0); assert(arr.front == 0); assert(arr.back == 3); // резервирование пространства arr.reserve(1000); assert(arr.length == 3); assert(arr.capacity >= 1000); // вставка arr.insertBefore(arr[1..$], 1); assert(arr.front == 0); assert(arr.length == 4); arr.insertBack(4); assert(arr.back == 4); assert(arr.length == 5); // установка элементов arr[1] *= 42; assert(arr[1] == 42);
import std.algorithm.comparison : equal; auto arr = Array!int(1, 2, 3); // конкатенация auto b = Array!int(11, 12, 13); arr ~= b; assert(arr.length == 6); // выделение среза assert(arr[1..3].equal([2, 3])); // удаление arr.linearRemove(arr[1..3]); assert(arr[0..2].equal([1, 11]));
Array!bool arr; arr.insert([true, true, false, true, false]); assert(arr.length == 5);
Переместиться к: 2 · back · capacity · clear · ConstRange · dup · empty · front · ImmutableRange · insert · insertAfter · insertBack · insertBefore · length · linearInsert · linearRemove · moveAt · opBinary · opDollar · opEquals · opIndex · opIndexAssign · opIndexOpAssign · opOpAssign · opSlice · opSliceAssign · opSliceOpAssign · opSliceUnary · Range · removeAny · removeBack · replace · reserve · stableInsert · stableInsertAfter · stableInsertBack · stableInsertBefore · stableLinearInsert · stableRemoveAny · stableRemoveBack · stableReplace · this
Array
(T) if (!is(Unqual!T == bool));
Array
использует malloc и free
для управления собственной памятью.
Array
станут висячими, как только элемент будет удалён из Array
. С другой стороны, память, распределённая Array
, будет сканироваться сборщиком мусора, и объекты, управляемые им, на которые есть ссылки из Array
, сохранятся живыми.
Замечание:
При использовании Array
с функциями, основанными на диапазонах, таких как в std.algorithm, у
Array
нужно взять срез, чтобы получить диапазон (например, используйте array[].map!
вместо array.map!). Сам контейнер не является диапазоном.
stuff
)opEquals
(const Array rhs
);
opEquals
(ref const Array rhs
);
ConstRange
– это вариант с константными элементами.
ImmutableRange
– это вариант с неизменяемыми элементами.Сложность: Ο(n).
true
тогда и только тогда, когда контейнер не имеет элементов.
Сложность: Ο(1)
Сложность: Ο(1).
Сложность: Ο(1)
elements
элементов.
Постусловие:
capacity >= elements
Сложность: Ο(1)
Глянул я в код этого метода, в нём после распределения новой памяти туда копируется весь массив (с помощью memcpy), а затем оставшееся место заполняется нулями (с помощью memset). Эти операции никак не могут быть Ο(1)... – прим. пер.
Сложность: Ο(1)
opSlice
(size_t i
, size_t j
);
Предусловие: a <= b && b <= length
Сложность: Ο(1)
front
и opSlice().back
, соответсвенно.
Предусловие: !empty
Сложность: Ο(1)
Предусловие:
i
< length
Сложность: Ο(1)
opSliceAssign
(T value
);
opSliceAssign
(T value
, size_t i
, size_t j
);
opSliceUnary
(string op)()opSliceUnary
(string op)(size_t i
, size_t j
)opSliceOpAssign
(string op)(T value
);
opSliceOpAssign
(string op)(T value
, size_t i
, size_t j
);
Предусловие:
i
< j
&& j
< length
Сложность: Ο(slice.length)
opBinary
.
Сложность:
Ο(n + m), где m – это количество элементов в stuff
stuff
).Postcondition: empty
Сложность: Ο(n)
length
(size_t newLength
);
length
, на неопределенные позиции в контейнере добавляются дополнительные элементы и инициализируются T.init.
Сложность:
Ο(abs(n - newLength
))
Постусловие:
length
== newLength
auto arr = make!Array([0, 1, 2, 3]); auto a1=arr[2..4]; writeln(arr.stableRemoveAny()); writeln("a1=",a1[]); // Ошибка! Range violation
Предусловие: !empty
Сложность: Ο(log(n)).
stuff
может быть значением, преобразуемым в T, или диапазоном объектов, преобразуемых в T. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(m * log(n)), где m – это количество элементов в stuff
Предусловие: !empty
Сложность: Ο(log(n)).
removeBack
(size_t howMany
);
stableRemoveBack
= removeBack;
howMany
значений с задней стороны контейнера. В отличие от безаргументной версии выше, эти функции не бросают исключений, если они не смогли удалить howMany
элементов. Вместо этого, если howMany
> n, удаляются все элементы. Возвращаемым значением является эффективное количество удалённых элементов. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(howMany
).
Переместиться к: 2
insertBefore
(Stuff)(Range r
, Stuff stuff
)insertBefore
(Stuff)(Range r
, Stuff stuff
)Переместиться к: 2
insertAfter
(Stuff)(Range r
, Stuff stuff
);
Переместиться к: 2
replace
(Stuff)(Range r
, Stuff stuff
)replace
(Stuff)(Range r
, Stuff stuff
)stuff
перед, после, или вместо диапазона r
, который должен быть действительным диапазоном, ранее извлечённым из этого контейнера. stuff
может быть значением, преобразуемым в T или диапазоном объектов, преобразуемых в T. Стабильная версия ведется себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(n + m), где m – это длина stuff
r
, который должен быть диапазоном, полученным первоначально из этого контейнера. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
r
.
Сложность:
Ο(n - m), где m – это количество элементов в
r
Array
(T) if (is(Unqual!T == bool));
Range
;
save
();
empty
();
front
();
front
(bool value
);
moveFront
();
popFront
();
back
();
back
(bool value
);
moveBack
();
popBack
();
opIndex
(size_t i
);
opIndexAssign
(T value
, size_t i
);
moveAt
(size_t i
);
length
();
opSlice
(size_t low
, size_t high
);
empty
();
true
тогда и только тогда, когда контейнер не имеет элементов.
Сложность: Ο(1)
dup
();
Сложность: Ο(n).
length
();
Сложность: Ο(log(n)).
capacity
();
Сложность: Ο(log(n)).
reserve
(size_t e
);
Postcondition: capacity >= n
Сложность:
Ο(log(e
- capacity)) if e
> capacity,
otherwise Ο(1).
opSlice
();
opSlice
().
Сложность: Ο(log(n))
opSlice
(size_t a
, size_t b
);
Сложность: Ο(log(n))
front
();
front
(bool value
);
back
();
back
(bool value
);
front
и opSlice().back
,
соответсвенно.
Сложность: Ο(log(n))
opIndex
(size_t i
);
opIndexAssign
(bool value
, size_t i
);
opIndexOpAssign
(string op)(bool value
, size_t i
);
moveAt
(size_t i
);
value
по определенному индексу.opBinary
(string op, Stuff)(Stuff rhs
)Сложность: Ο(n + m), где m – это количество элементов в stuff
opOpAssign
(string op, Stuff)(Stuff stuff
)stuff
).clear
();
Постусловие: empty
Сложность: Ο(n)
length
(size_t newLength
);
length
, в контейнер добавляются элементы и инициализируются в
ElementType.init.
Сложность:
Ο(abs(n - newLength
))
Постусловие:
length == newLength
insert
= insertBack;
stableInsert
= insertBack;
stableInsert
.
Сложность: Ο(m * log(n)), где m – это количество элементов в stuff
linearInsert
= insertBack;
stableLinearInsert
= insertBack;
removeAny
();
stableRemoveAny
= removeAny;
Предусловие: !empty
Сложность: Ο(log(n))
insertBack
(Stuff)(Stuff stuff
)insertBack
(Stuff)(Stuff stuff
)stableInsertBack
= insertBack;
stuff
может быть значением, преобразуемым в ElementType, или диапазоном объектов, преобразуемых в ElementType. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность: Ο(log(n))
removeBack
();
stableRemoveBack
= removeBack;
Предусловие: !empty
Сложность: Ο(log(n)).
removeBack
(size_t howMany
);
howMany
значений с задней стороны контейнера. В отличие от безаргументной версии выше, эти функции не бросают исключений, если они не смогли удалить howMany
элементов. Вместо этого, если howMany
> n, удаляются все элементы. Возвращаемым значением является эффективное количество удалённых элементов. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(howMany
* log(n)).
insertBefore
(Stuff)(Range r
, Stuff stuff
);
stableInsertBefore
= insertBefore;
insertAfter
(Stuff)(Range r
, Stuff stuff
);
stableInsertAfter
= insertAfter;
replace
(Stuff)(Range r
, Stuff stuff
)stableReplace
= replace;
stuff
перед, после, или вместо диапазона r
, который должен быть действительным диапазоном, ранее извлечённым из этого контейнера. stuff
может быть значением, преобразуемым в T или диапазоном объектов, преобразуемых в T. Стабильная версия ведется себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(n + m), где m – это длина stuff
linearRemove
(Range r
);
r
, который должен быть диапазоном, полученным первоначально из этого контейнера. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
r
.
Сложность: Ο(n)