Переместиться к: DList
Исходный код: std/container/dlist.d
import std.container : DList; import std.algorithm.comparison : equal; auto s = DList!int(1, 2, 3); assert(equal(s[], [1, 2, 3])); s.removeFront(); assert(equal(s[], [2, 3])); s.removeBack(); assert(equal(s[], [2])); s.insertFront([4, 5]); assert(equal(s[], [4, 5, 2])); s.insertBack([6, 7]); assert(equal(s[], [4, 5, 2, 6, 7])); // Если вы хотите применять операции с диапазонами, просто выделите срез. import std.algorithm.searching : countUntil; import std.range : popFrontN, popBackN, walkLength; auto sl = DList!int([1, 2, 3, 4, 5]); assert(countUntil(sl[], 2) == 1); auto r = sl[]; popFrontN(r, 2); popBackN(r, 2); assert(r.equal([3])); assert(walkLength(r) == 1);
Переместиться к: back · clear · dup · empty · front · insert · insertAfter · insertBack · insertBefore · insertFront · linearRemove · opBinary · opBinaryRight · opEquals · opOpAssign · opSlice · Range · remove · removeAny · removeBack · removeFront · stableInsert · stableInsertAfter · stableInsertBack · stableInsertBefore · stableInsertFront · stableLinearRemove · stableRemove · stableRemoveAny · stableRemoveBack · stableRemoveFront · this
DList
(T);
DList
использует ссылочную семантику.stuff
)opEquals
()(ref const DList rhs
)Сложность:
Ο(min(n, n1)), где n1 – это количество элементов в
rhs
.
Range
;
empty
();
true
тогда и только тогда, когда контейнер не имеет элементов.
Сложность: Ο(1)
clear
();
Постусловие: empty
Сложность: Ο(1)
dup
();
Сложность: Ο(n).
opSlice
();
Сложность: Ο(1)
front
();
front
.
Сложность: Ο(1)
back
();
back
.
Сложность: Ο(1)
opBinary
(string op, Stuff)(Stuff rhs
)rhs
))));
rhs
.opBinaryRight
(string op, Stuff)(Stuff lhs
)lhs
))));
lhs
и this.opOpAssign
(string op, Stuff)(Stuff rhs
)rhs
))));
rhs
в this.insertFront
(Stuff)(Stuff stuff
);
insertBack
(Stuff)(Stuff stuff
);
insert
= insertBack;
stableInsert
= insert;
stableInsertFront
= insertFront;
stableInsertBack
= insertBack;
stuff
спереди/сзади контейнера. stuff
может быть значением, преобразуемым в T, или диапазоном объектов, преобразуемых в T. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность: Ο(log(n))
insertBefore
(Stuff)(Range r
, Stuff stuff
);
stableInsertBefore
= insertBefore;
insertAfter
(Stuff)(Range r
, Stuff stuff
);
stableInsertAfter
= insertAfter;
stuff
после диапазона r
, который должен быть не-пустым диапазоном, ранее извлечённым из этого контейнера.
stuff
может быть значением, преобразуемым в T, или диапазоном объектов, преобразуемых в T. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(k + m), где k – это количество элементов в
r
, и m – это длина stuff
.
removeAny
();
stableRemoveAny
= removeAny;
Предусловие: !empty
Сложность: Ο(1).
Предусловие: !empty
Сложность: Ο(1).
removeFront
(size_t howMany
);
stableRemoveFront
= removeFront;
removeBack
(size_t howMany
);
stableRemoveBack
= removeBack;
howMany
значений спереди или сзади контейнера. В отличие от непараметризованной версии, описанной выше, эти функции не бросают исключений, если они не могут удалить howMany
элементов. Вместо этого, если howMany
> n, удаляются все элементы. Возвращаемым значением является действительное количество удалённых элементов. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(howMany
).
r
, которые должны быть диапазоном, полученным первоначально из этого контейнера.
r
.
Сложность: Ο(1)
linearRemove
(Take!Range r
);
stableRemove
= remove;
stableLinearRemove
= linearRemove;
linearRemove
действует как remove, но также принимает диапазоны, которые являются результатом операции take. Это удобный способ удалить фиксированное количество элементов из диапазона.
Сложность:
Ο(r
.walkLength)