std.container.slist
Этот модуль реализует контейнер односвязного списка. Он может использоваться как стек.
Этот модуль является подмодулем std.container.
- Источник
- std/container/slist.d
- Лицензия:
- Распространяется по лицензии Boost Software License, версия 1.0. (См. прилагаемый файл LICENSE_1_0.txt или копию по адресу boost.org/LICENSE_1_0.txt).
- Авторы:
- Андрей Александреску
- Примеры:
-
import std.algorithm.comparison : equal; import std.container : SList; 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])); // If you want to apply range operations, simply slice it. import std.algorithm.searching : countUntil; import std.range : popFrontN, walkLength; auto sl = SList!int(1, 2, 3, 4, 5); writeln(countUntil(sl[], 2)); // 1 auto r = sl[]; popFrontN(r, 2); writeln(walkLength(r)); // 3
- struct SList(T) if (!is(T == shared));
-
Реализует простой и быстрый односвязный список. Он может использоваться как стек.
SListиспользует семантику ссылок.- this(U)(U[] values...)
Constraints: if (isImplicitlyConvertible!(U, T)); -
Конструктор, принимающий несколько узлов
- this(Stuff)(Stuff stuff)
Constraints: if (isInputRange!Stuff && isImplicitlyConvertible!(ElementType!Stuff, T) && !is(Stuff == T[])); -
Конструктор, принимающий входной диапазон
- const bool opEquals(const SList rhs);
const bool opEquals(ref const SList rhs); -
Сравнение на равенство.
- Сложность
- Ο(
min(n, n1)) гдеn1— количество элементов вrhs.
- struct Range;
-
Определяет основной диапазон контейнера, который воплощает диапазон вперёд.
- const @property bool empty();
@property ref T front();
void popFront(); -
Примитивы входного диапазона.
- @property Range save();
-
Примитив диапазона вперёд.
- const @property bool empty();
- const @property bool empty();
-
Свойство, возвращающее
trueтогда и только тогда, когда контейнер не содержит элементов.- Сложность
- Ο(
1)
- @property SList dup();
-
Создаёт копию контейнера. Элементы сами не дублируются.
- Сложность
- Ο(
n).
- Range opSlice();
-
Возвращает диапазон, который итерирует по всем элементам контейнера в прямом порядке.
- Сложность
- Ο(
1)
- @property ref T front();
-
Переходит к
opSlice().front.- Сложность
- Ο(
1)
- SList opBinary(string op, Stuff)(Stuff rhs)
Constraints: if (op == "~" && is(typeof(SList(rhs))));
SList opBinaryRight(string op, Stuff)(Stuff lhs)
Constraints: if (op == "~" && !is(typeof(lhs.opBinary!"~"(this))) && is(typeof(SList(lhs)))); -
Возвращает новый
SList, который представляет собой конкатенациюthisи его аргумента.opBinaryRightопределён только еслиStuffне определяетopBinary. - void clear();
-
Удаляет все содержимое из
SList.- Постусловие
-
empty
- Сложность
- Ο(
1)
- void reverse();
-
Инвертирует SList на месте. Не выполняет выделения памяти.
- Сложность
- Ο(
n)
- size_t insertFront(Stuff)(Stuff stuff)
Constraints: if (isInputRange!Stuff || isImplicitlyConvertible!(Stuff, T));
alias insert = insertFront;
alias stableInsert = insert;
alias stableInsertFront = insertFront; -
Вставляет
stuffв начало контейнера.stuffможет быть значением, преобразуемым вT, или диапазоном объектов, преобразуемых вT. Стабильная версия работает аналогично, но гарантирует, что итераторы диапазонов, работающих с контейнером, никогда не станут недействительными.- Возвращает:
- Количество добавленных элементов
- Сложность
- Ο(
m), гдеm— длинаstuff
- T removeAny();
alias stableRemoveAny = removeAny; -
Выбирает значение в неопределённой позиции в контейнере, удаляет его из контейнера и возвращает его. Стабильная версия работает аналогично, но гарантирует, что итераторы диапазонов, работающих с контейнером, никогда не станут недействительными.
- Предварительное условие
-
!empty
- Возвращает:
- Удалённый элемент.
- Сложность
- Ο(
1).
- void removeFront();
alias stableRemoveFront = removeFront; -
Удаляет значение в начале контейнера. Стабильная версия работает аналогично, но гарантирует, что итераторы диапазонов, работающих с контейнером, никогда не станут недействительными.
- Предварительное условие
-
!empty
- Сложность
- Ο(
1).
- size_t removeFront(size_t howMany);
alias stableRemoveFront = removeFront; -
Удаляет
howManyзначений в начале или конце контейнера. В отличие от неопределённых версий выше, эти функции не выбрасывают исключения, если не удалилиhowManyэлементов. Вместо этого, еслиhowMany > n, все элементы удаляются. Возвращаемое значение — эффективное количество удалённых элементов. Стабильная версия работает аналогично, но гарантирует, что итераторы диапазонов, работающих с контейнером, никогда не станут недействительными.- Возвращает:
- Количество удалённых элементов
- Сложность
- Ο(
howMany * log(n)).
- size_t insertAfter(Stuff)(Range r, Stuff stuff)
Constraints: if (isInputRange!Stuff || isImplicitlyConvertible!(Stuff, T)); -
Вставляет
stuffпосле диапазонаr, который должен быть диапазоном, ранее извлечённым из этого контейнера. Учитывая, что все диапазоны для списка заканчиваются в конце списка, эта функция по существу добавляет в конец списка и используетrкак потенциально быстрый способ достижения последнего узла в списке. В идеалеrрасположен близко к или в последнем элементу списка.stuffможет быть значением, преобразуемым вT, или диапазоном объектов, преобразуемых вT. Стабильная версия работает аналогично, но гарантирует, что итераторы диапазонов, работающих с контейнером, никогда не станут недействительными.- Возвращает:
- Количество вставленных значений.
- Сложность
- Ο(
k + m), гдеk— количество элементов вrиm— длинаstuff.
- Пример
auto sl = SList!string(["a", "b", "d"]); sl.insertAfter(sl[], "e"); // insert at the end (slowest) assert(std.algorithm.equal(sl[], ["a", "b", "d", "e"])); sl.insertAfter(std.range.take(sl[], 2), "c"); // insert after "b" assert(std.algorithm.equal(sl[], ["a", "b", "c", "d", "e"]));
- size_t insertAfter(Stuff)(Take!Range r, Stuff stuff)
Constraints: if (isInputRange!Stuff || isImplicitlyConvertible!(Stuff, T));
alias stableInsertAfter = insertAfter; -
Аналогично
insertAfterвыше, но принимает диапазон, ограниченный по количеству. Это важно для обеспечения быстрой вставки в середину списка. Для быстрой вставки после указанной позицииr, используйтеinsertAfter(take(r, 1), stuff). Сложность этой операции зависит только от количества элементов вstuff.- Предварительное условие
-
r.original.empty || r.maxLength > 0
- Возвращает:
- Количество вставленных значений.
- Сложность
- Ο(
k + m), гдеk— количество элементов вrиm— длинаstuff.
- Range linearRemove(Range r);
-
Удаляет диапазон из списка за линейное время.
- Возвращает:
- Пустой диапазон.
- Сложность
- Ο(
n)
- Range linearRemove(Take!Range r);
alias stableLinearRemove = linearRemove; -
Удаляет
Take!Rangeиз списка за линейное время.- Возвращает:
- Диапазон, охватывающий элементы после удалённого диапазона.
- Сложность
- Ο(
n)
- bool linearRemoveElement(T value);
-
Удаляет первое вхождение элемента из списка за линейное время.
- Возвращает:
- True, если элемент существовал и был успешно удалён, иначе false.
- Параметры:
T valueзначение узла, который нужно удалить
- Сложность
- Ο(
n)
- this(U)(U[] values...)
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_container_slist.html