Переместиться к: SList
Исходный код: std/container/slist.d
import std.container : SList; import std.algorithm.comparison : equal; auto s = SList!int(1, 2, 3); assert(equal(s[], [1, 2, 3])); s.removeFront(); assert(equal(s[], [2, 3])); s.insertFront([5, 6]); assert(equal(s[], [5, 6, 2, 3])); // Если вы хотите применять операции с диапазоном, просто получите срез. import std.algorithm.searching : countUntil; import std.range : popFrontN, walkLength; auto sl = SList!int(1, 2, 3, 4, 5); assert(countUntil(sl[], 2) == 1); auto r = sl[]; popFrontN(r, 2); assert(walkLength(r) == 3);
Переместиться к: clear · dup · empty · front · insert · insertAfter · insertFront · linearRemove · opBinary · opBinaryRight · opEquals · opSlice · Range · removeAny · removeFront · reverse · stableInsert · stableInsertAfter · stableInsertFront · stableLinearRemove · stableRemoveAny · stableRemoveFront · this
SList
(T);
SList
использует ссылочную семантику.stuff
)opEquals
(const SList rhs
);
opEquals
(ref const SList rhs
);
Сложность:
Ο(min(n, n1)), где n1 – это количество элементов в rhs
.
empty
();
front
();
popFront
();
save
();
empty
();
true
тогда и только тогда, когда контейнер не имеет элементов.
Сложность: Ο(1)
dup
();
Сложность: Ο(n).
opSlice
();
Сложность: Ο(1)
front
();
front
.
Сложность: Ο(1)
opBinary
(string op, Stuff)(Stuff rhs
)rhs
))));
opBinaryRight
(string op, Stuff)(Stuff lhs
)lhs
.opBinary!"~"(this))) && is(typeof(SList(lhs
))));
opBinaryRight
определен только, если Stuff не определяет opBinary
.clear
();
Постусловие: empty
Сложность: Ο(1)
reverse
();
Сложность: Ο(n)
insertFront
(Stuff)(Stuff stuff
)insertFront
(Stuff)(Stuff stuff
)insert
= insertFront;
stableInsert
= insert;
stableInsertFront
= insertFront;
stuff
спереди контейнера. stuff
может быть значением, преобразуемым в T, или диапазоном объектов, преобразуемых в T. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(m), где m – это длина stuff
removeAny
();
stableRemoveAny
= removeAny;
Предусловие: !empty
Сложность: Ο(1).
Предусловие: !empty
Сложность: Ο(1).
removeFront
(size_t howMany
);
stableRemoveFront
= removeFront;
howMany
значений спереди контейнера. В отличие от непараметризованной версии, описанной выше, эти функции не бросают исключений, если они не могут удалить howMany
элементов. Вместо этого, если howMany
> n, удаляются все элементы. Возвращаемым значением является действительное количество удалённых элементов. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(howMany
* log(n)).
stuff
после диапазона r
, который должен быть диапазоном, ранее извлечённым из этого контейнера. Учитывая, что все диапазоны для списка заканчиваются в конце списка, эта функция по существу добавляет к списку и использует r
как потенциально быстрый способ достигнуть последнего узла в списке. В идеале r
расположен около или на последнем элементе списка.
stuff
может быть значением, преобразуемым в T, или диапазоном объектов, преобразуемых в T. Стабильная версия ведет себя так же, но гарантирует, что диапазоны, итерирующие по контейнеру, никогда не станут недействительными.
Сложность:
Ο(k + m), где k – это количество элементов в
r
, и m – это длина stuff
.
Пример:
auto sl = SList!string(["a", "b", "d"]); sl.insertAfter(sl[], "e"); // вставить в конце (медленно) assert(std.algorithm.equal(sl[], ["a", "b", "d", "e"])); sl.insertAfter(std.range.take(sl[], 2), "c"); // вставить после "b" assert(std.algorithm.equal(sl[], ["a", "b", "c", "d", "e"]));
insertAfter
(Stuff)(Take!Range r
, Stuff stuff
);
stableInsertAfter
= insertAfter;
insertAfter
, описанному выше, но принимает диапазон, ограниченный по количеству. Важно для обеспечения быстрых вставок в середине списка. Для быстрых вставок после определенной позиции r
, используйте insertAfter
(take(r
, 1), stuff
). Сложность этого действия зависит только от количества элементов в stuff
.
Предусловие:
r
.original.empty || r
.maxLength > 0
Сложность:
Ο(k + m), где k – это количество элементов в
r
, и m – это длина stuff
.
Сложность: Ο(n)
linearRemove
(Take!Range r
);
stableLinearRemove
= linearRemove;
Сложность: Ο(n)