std.algorithm.searching
Это подмодуль std.algorithm. Он содержит общие алгоритмы поиска.
| Имя функции | Описание |
|---|---|
all | all!"a > 0"([1, 2, 3, 4]) возвращает true, так как все элементы положительные |
any | any!"a > 0"([1, 2, -3, -4]) возвращает true, так как по крайней мере один элемент положительный |
balancedParens | balancedParens("((1 + 1) / 2)") возвращает true, так как строка имеет сбалансированные скобки. |
boyerMooreFinder | find("hello world", boyerMooreFinder("or")) возвращает "orld" с использованием алгоритма Бойера-Мура. |
canFind | canFind("hello world", "or") возвращает true. |
count | Считает элементы, равные заданному значению или удовлетворяющие предикату. count([1, 2, 1], 1) возвращает 2, и count!"a < 0"([1, -3, 0]) возвращает 1. |
countUntil | countUntil(a, b) возвращает количество шагов, сделанных в a для достижения b; например, countUntil("hello!", "o") возвращает 4. |
commonPrefix | commonPrefix("parakeet", "parachute") возвращает "para". |
endsWith | endsWith("rocks", "ks") возвращает true. |
find | find("hello world", "or") возвращает "orld" с использованием линейного поиска. (Для двоичного поиска см. std.range.SortedRange.) |
findAdjacent | findAdjacent([1, 2, 3, 3, 4]) возвращает поддиапазон, начинающийся с двух равных смежных элементов, т.е. [3, 3, 4]. |
findAmong | findAmong("abcd", "qcx") возвращает "cd", так как 'c' содержится в "qcx". |
findSkip | Если a = "abcde", то findSkip(a, "x") возвращает false и оставляет a без изменений, тогда как findSkip(a, "c") перемещает a к "de" и возвращает true. |
findSplit | findSplit("abcdefg", "de") возвращает три диапазона "abc", "de" и "fg". |
findSplitAfter | findSplitAfter("abcdefg", "de") возвращает два диапазона "abcde" и "fg". |
findSplitBefore | findSplitBefore("abcdefg", "de") возвращает два диапазона "abc" и "defg". |
minCount | minCount([2, 1, 1, 4, 1]) возвращает tuple(1, 3). |
maxCount | maxCount([2, 4, 1, 4, 1]) возвращает tuple(4, 2). |
minElement | Выбирает минимальный элемент диапазона. minElement([3, 4, 1, 2]) возвращает 1. |
maxElement | Выбирает максимальный элемент диапазона. maxElement([3, 4, 1, 2]) возвращает 4. |
minIndex | Индекс минимального элемента диапазона. minElement([3, 4, 1, 2]) возвращает 2. |
maxIndex | Индекс максимального элемента диапазона. maxElement([3, 4, 1, 2]) возвращает 1. |
minPos | minPos([2, 3, 1, 3, 4, 1]) возвращает поддиапазон [1, 3, 4, 1], т.е. помещает диапазон в позицию первого вхождения минимального элемента. |
maxPos | maxPos([2, 3, 1, 3, 4, 1]) возвращает поддиапазон [4, 1], т.е. помещает диапазон в позицию первого вхождения максимального элемента. |
skipOver | Предположим a = "blah". Тогда skipOver(a, "bi") оставляет a без изменений и возвращает false, тогда как skipOver(a, "bl") перемещает a к "ah" и возвращает true. |
startsWith | startsWith("hello, world", "hello") возвращает true. |
until | Лениво итерирует диапазон до тех пор, пока не найдено определенное значение. |
- Лицензия:
- Boost License 1.0.
- Авторы:
- Andrei Alexandrescu
- Источник
- std/algorithm/searching.d
- template all(alias pred = "a")
-
Проверяет, что все элементы удовлетворяют
pred.- Примеры:
-
assert( all!"a & 1"([1, 3, 5, 7, 9])); assert(!all!"a & 1"([1, 2, 3, 5, 7, 9]));
- Примеры:
-
allтакже может быть использован без предиката, если его элементы могут быть оценены как true или false в условном операторе. Это может быть удобным способом быстро проверить, что все элементы диапазона равны true.int[3] vals = [5, 3, 18]; assert( all(vals[]));
- bool all(Range)(Range range)
Constraints: if (isInputRange!Range); -
Возвращает
trueтогда и только тогда, когда все значенияvв входном диапазонеrangeудовлетворяют предикатуpred. Выполняет (как максимум) Ο(range.length) вычисленийpred.
- template any(alias pred = "a")
-
Проверяет, что хотя бы один элемент удовлетворяет
pred.!anyможет быть использован, чтобы проверить, что ни один элемент не удовлетворяетpred. Иногда это называетсяexistsна других языках.- Примеры:
-
import std.ascii : isWhite; assert( all!(any!isWhite)(["a a", "b b"])); assert(!any!(all!isWhite)(["a a", "b b"]));
- Примеры:
-
anyтакже может быть использован без предиката, если его элементы могут быть оценены как true или false в условном операторе. Это может быть удобным способом быстро проверить, что ни один из элементов диапазона не равен true.int[3] vals1 = [0, 0, 0]; assert(!any(vals1[])); //none of vals1 evaluate to true int[3] vals2 = [2, 0, 2]; assert( any(vals2[])); assert(!all(vals2[])); int[3] vals3 = [3, 3, 3]; assert( any(vals3[])); assert( all(vals3[]));
- bool any(Range)(Range range)
Constraints: if (isInputRange!Range && is(typeof(unaryFun!pred(range.front)))); -
Возвращает
trueтогда и только тогда, когда хотя бы одно значениеvв входном диапазонеrangeудовлетворяет предикатуpred. Выполняет (как максимум) Ο(range.length) вычисленийpred.
- bool balancedParens(Range, E)(Range r, E lPar, E rPar, size_t maxNestingLevel = size_t.max)
Constraints: if (isInputRange!Range && is(typeof(r.front == lPar))); -
Проверяет, что
rимеет "сбалансированные скобки", т.е. все вхожденияlParзакрываются соответствующими вхождениямиrPar. ПараметрmaxNestingLevelконтролирует разрешенную глубину вложенности. Наиболее распространённые значения - по умолчанию или0. В последнем случае вложенность не допускается.- Параметры:
Range rДиапазон для проверки. E lParЭлемент, соответствующий левой (открывающей) скобке. E rParЭлемент, соответствующий правой (закрывающей) скобке. size_t maxNestingLevelМаксимальная разрешенная глубина вложенности.
- Возвращает:
- true, если в заданном диапазоне скобки сбалансированы в рамках заданной максимальной глубины вложенности; в противном случае — false.
- Примеры:
-
auto s = "1 + (2 * (3 + 1 / 2)"; assert(!balancedParens(s, '(', ')')); s = "1 + (2 * (3 + 1) / 2)"; assert(balancedParens(s, '(', ')')); s = "1 + (2 * (3 + 1) / 2)"; assert(!balancedParens(s, '(', ')', 0)); s = "1 + (2 * 3 + 1) / (2 - 5)"; assert(balancedParens(s, '(', ')', 0)); s = "f(x) = ⌈x⌉"; assert(balancedParens(s, '⌈', '⌉'));
- struct BoyerMooreFinder(alias pred, Range);
BoyerMooreFinder!(binaryFun!pred, Range) boyerMooreFinder(alias pred = "a == b", Range)(Range needle)
Constraints: if (isRandomAccessRange!Range && hasSlicing!Range || isSomeString!Range); -
Настраивает алгоритм Бойера-Мура для использования с
findниже. По умолчанию элементы сравниваются на равенство.BoyerMooreFinderвыделяет память GC.- Параметры:
pred Предикат для сравнения элементов. Range needleДиапазон произвольного доступа с длиной и возможностью срезов.
- Возвращает:
- Экземпляр
BoyerMooreFinder, который может быть использован сfind()для вызова алгоритма Бойера-Мура для поискаneedleв заданном массиве.
- Примеры:
-
auto bmFinder = boyerMooreFinder("TG"); string r = "TAGTGCCTGA"; // search for the first match in the haystack r r = bmFinder.beFound(r); writeln(r); // "TGCCTGA" // continue search in haystack r = bmFinder.beFound(r[2 .. $]); writeln(r); // "TGA"
- this(Range needle);
- scope Range beFound(Range haystack);
- @property size_t length();
- alias opDollar = length;
- auto commonPrefix(alias pred = "a == b", R1, R2)(R1 r1, R2 r2)
Constraints: if (isForwardRange!R1 && isInputRange!R2 && !isNarrowString!R1 && is(typeof(binaryFun!pred(r1.front, r2.front))));
auto commonPrefix(alias pred, R1, R2)(R1 r1, R2 r2)
Constraints: if (isNarrowString!R1 && isInputRange!R2 && is(typeof(binaryFun!pred(r1.front, r2.front))));
auto commonPrefix(R1, R2)(R1 r1, R2 r2)
Constraints: if (isNarrowString!R1 && isInputRange!R2 && !isNarrowString!R2 && is(typeof(r1.front == r2.front)));
auto commonPrefix(R1, R2)(R1 r1, R2 r2)
Constraints: if (isNarrowString!R1 && isNarrowString!R2); -
Возвращает общее префиксное подмножество двух диапазонов.
- Параметры:
pred Предикат для сравнения элементов на предмет общности. По умолчанию используется равенство "a == b".R1 r1Диапазон элементов. R2 r2Входной диапазон элементов.
- Возвращает:
- Срез
r1содержащий символы, с которых оба диапазона начинаются, если первый аргумент — строка; в противном случае, то же, что и результатtakeExactly(r1, n), гдеn— количество элементов в общем префиксе обоих диапазонов.
- См. также:
std.range.takeExactly
- Примеры:
-
writeln(commonPrefix("hello, world", "hello, there")); // "hello, "
- size_t count(alias pred = "a == b", Range, E)(Range haystack, E needle)
Constraints: if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(haystack.front, needle)) : bool));
size_t count(alias pred = "a == b", R1, R2)(R1 haystack, R2 needle)
Constraints: if (isForwardRange!R1 && !isInfinite!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack.front, needle.front)) : bool));
size_t count(alias pred, R)(R haystack)
Constraints: if (isInputRange!R && !isInfinite!R && is(typeof(unaryFun!pred(haystack.front)) : bool));
size_t count(R)(R haystack)
Constraints: if (isInputRange!R && !isInfinite!R); -
Первый вариант подсчитывает количество элементов
xвrдля которыхpred(x, value)равноtrue.predпо умолчанию равно равенству. Выполняет Ο(haystack.length) вычисленийpred.Второй вариант возвращает количество раз, когда
needleвстречается вhaystack. Бросает исключение, еслиneedle.empty, так как количество пустого диапазона в любом диапазоне будет бесконечным. Перекрывающиеся подсчеты не учитываются, напримерcount("aaa", "aa")равно1, а не2.
Третий вариант подсчитывает элементы, для которыхpred(x)равноtrue. Выполняет Ο(haystack.length) вычисленийpred.
Четвёртый вариант подсчитывает количество элементов в диапазоне. Это оптимизация для третьего варианта: если заданный диапазон имеет свойствоlength, то счет возвращается сразу же, иначе выполняется Ο(haystack.length) для обхода диапазона.- Примечание
- Независимо от перегрузки,
countне будет принимать бесконечные диапазоны дляhaystack.
- Параметры:
pred Предикат для оценки. Range haystackДиапазон для подсчета. E needleЭлемент или поддиапазон для подсчета в haystack.
- Возвращает:
- Количество позиций в
haystackдля которыхpredвернул true.
- Примеры:
-
import std.uni : toLower; // count elements in range int[] a = [ 1, 2, 4, 3, 2, 5, 3, 2, 4 ]; writeln(count(a)); // 9 writeln(count(a, 2)); // 3 writeln(count!("a > b")(a, 2)); // 5 // count range in range writeln(count("abcadfabf", "ab")); // 2 writeln(count("ababab", "abab")); // 1 writeln(count("ababab", "abx")); // 0 // fuzzy count range in range writeln(count!((a, b) => toLower(a) == toLower(b))("AbcAdFaBf", "ab")); // 2 // count predicate in range writeln(count!("a > 1")(a)); // 8
- ptrdiff_t countUntil(alias pred = "a == b", R, Rs...)(R haystack, Rs needles)
Constraints: if (isForwardRange!R && (Rs.length > 0) && (isForwardRange!(Rs[0]) == isInputRange!(Rs[0])) && is(typeof(startsWith!pred(haystack, needles[0]))) && (Rs.length == 1 || is(typeof(countUntil!pred(haystack, needles[1..$])))));
ptrdiff_t countUntil(alias pred = "a == b", R, N)(R haystack, N needle)
Constraints: if (isInputRange!R && is(typeof(binaryFun!pred(haystack.front, needle)) : bool));
ptrdiff_t countUntil(alias pred, R)(R haystack)
Constraints: if (isInputRange!R && is(typeof(unaryFun!pred(haystack.front)) : bool));
-
Подсчитывает элементы в заданном прямолинейном диапазоне до тех пор, пока заданный предикат не станет истинным для одного из заданных
needles.- Параметры:
pred Предикат для определения момента прекращения подсчёта. R haystackДиапазон ввода для подсчёта. Rs needlesЛибо отдельный элемент, либо прямолинейный диапазон элементов, которые поочерёдно будут оцениваться относительно каждого элемента в haystackв соответствии с заданным предикатом.
- Возвращаемое значение:
- Количество элементов, которые необходимо удалить из начала
haystack, прежде чем будет достигнут элемент, для которогоstartsWith!pred(haystack, needles)равноtrue. ЕслиstartsWith!pred(haystack, needles)не равноtrueни для одного элемента вhaystack, то возвращается-1. Если предоставлен толькоpred, тоpred(haystack)проверяется для каждого элемента.
- См. также:
std.string.indexOf
- Примеры:
-
writeln(countUntil("hello world", "world")); // 6 writeln(countUntil("hello world", 'r')); // 8 writeln(countUntil("hello world", "programming")); // -1 writeln(countUntil("日本語", "本語")); // 1 writeln(countUntil("日本語", '語')); // 2 writeln(countUntil("日本語", "五")); // -1 writeln(countUntil("日本語", '五')); // -1 writeln(countUntil([0, 7, 12, 22, 9], [12, 22])); // 2 writeln(countUntil([0, 7, 12, 22, 9], 9)); // 4 writeln(countUntil!"a > b"([0, 7, 12, 22, 9], 20)); // 3
- Примеры:
-
import std.ascii : isDigit; import std.uni : isWhite; writeln(countUntil!(std.uni.isWhite)("hello world")); // 5 writeln(countUntil!(std.ascii.isDigit)("hello world")); // -1 writeln(countUntil!"a > 20"([0, 7, 12, 22, 9])); // 3
- uint endsWith(alias pred = "a == b", Range, Needles...)(Range doesThisEnd, Needles withOneOfThese)
Constraints: if (isBidirectionalRange!Range && (Needles.length > 1) && is(typeof(.endsWith!pred(doesThisEnd, withOneOfThese[0])) : bool) && is(typeof(.endsWith!pred(doesThisEnd, withOneOfThese[1..$])) : uint));
bool endsWith(alias pred = "a == b", R1, R2)(R1 doesThisEnd, R2 withThis)
Constraints: if (isBidirectionalRange!R1 && isBidirectionalRange!R2 && is(typeof(binaryFun!pred(doesThisEnd.back, withThis.back)) : bool));
bool endsWith(alias pred = "a == b", R, E)(R doesThisEnd, E withThis)
Constraints: if (isBidirectionalRange!R && is(typeof(binaryFun!pred(doesThisEnd.back, withThis)) : bool));
bool endsWith(alias pred, R)(R doesThisEnd)
Constraints: if (isInputRange!R && ifTestable!(typeof(doesThisEnd.front), unaryFun!pred)); -
Проверяет, заканчивается ли заданный диапазон (одним из) заданных искомых элементов. Обратная функция
startsWith.- Параметры:
pred Предикат для сравнения элементов между диапазоном и искомыми элементами. Range doesThisEndДвунаправленный диапазон для проверки. Needles withOneOfTheseИскомые элементы для проверки, которые могут быть отдельными элементами или двунаправленными диапазонами элементов. R2 withThisОтдельный элемент для проверки.
- Возвращаемое значение:
- 0, если искомые элементы не находятся в конце заданного диапазона; иначе позиция совпавшего искомого элемента, то есть 1, если диапазон заканчивается на
withOneOfThese[0], 2, если он заканчивается наwithOneOfThese[1], и так далее. В случае, когда не заданы параметры искомых элементов, возвращаетсяtrueесли конецdoesThisStartудовлетворяет предикатуpred.
- Примеры:
-
import std.ascii : isAlpha; assert("abc".endsWith!(a => a.isAlpha)); assert("abc".endsWith!isAlpha); assert(!"ab1".endsWith!(a => a.isAlpha)); assert(!"ab1".endsWith!isAlpha); assert(!"".endsWith!(a => a.isAlpha)); import std.algorithm.comparison : among; assert("abc".endsWith!(a => a.among('c', 'd') != 0)); assert(!"abc".endsWith!(a => a.among('a', 'b') != 0)); assert(endsWith("abc", "")); assert(!endsWith("abc", "b")); writeln(endsWith("abc", "a", 'c')); // 2 writeln(endsWith("abc", "c", "a")); // 1 writeln(endsWith("abc", "c", "c")); // 1 writeln(endsWith("abc", "bc", "c")); // 2 writeln(endsWith("abc", "x", "c", "b")); // 2 writeln(endsWith("abc", "x", "aa", "bc")); // 3 writeln(endsWith("abc", "x", "aaa", "sab")); // 0 writeln(endsWith("abc", "x", "aaa", 'c', "sab")); // 3
- InputRange find(alias pred = "a == b", InputRange, Element)(InputRange haystack, scope Element needle)
Constraints: if (isInputRange!InputRange && is(typeof(binaryFun!pred(haystack.front, needle)) : bool) && !is(typeof(binaryFun!pred(haystack.front, needle.front)) : bool));
InputRange find(alias pred, InputRange)(InputRange haystack)
Constraints: if (isInputRange!InputRange);
R1 find(alias pred = "a == b", R1, R2)(R1 haystack, scope R2 needle)
Constraints: if (isForwardRange!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack.front, needle.front)) : bool)); -
Находит отдельный элемент в диапазоне ввода. Элементы
haystackсравниваются сneedleс помощью предикатаpredиpred(haystack.front, needle).findвыполняет Ο(walkLength(haystack)) вычисленийpred.Предикат передаётся в
std.functional.binaryFunи может принимать строку или любой вызываемый объект, который можно выполнить с помощьюpred(element, element).
Чтобы найти последнее вхождениеneedleв двунаправленномhaystack, вызовитеfind(retro(haystack), needle). См.std.range.retro.
Еслиneedleне указан,pred(haystack.front)будет вычисляться для каждого элемента диапазона ввода.
Еслиinputявляется прямолинейным диапазоном,needleтакже может быть прямолинейным диапазоном. В этом случаеstartsWith!pred(haystack, needle)вычисляется при каждой проверке.- Примечание
-
findработает аналогичноdropWhileв других языках.
- Сложность
-
findвыполняет Ο(walkLength(haystack)) вычисленийpred. Существуют специализации, которые улучшают производительность, используя преимущества двунаправленных или случайных диапазонов (если это возможно).
- Параметры:
pred Предикат для сравнения каждого элемента с искомым элементом, по умолчанию сравнивающий на равенство "a == b". Отрицательный предикат"a != b"можно использовать для поиска вместо первого элемента, не соответствующего искомому элементу.InputRange haystackДиапазон ввода для поиска. Element needleИскомый элемент.
- Возвращаемое значение:
-
haystackперемещён таким образом, что передний элемент является искомым; то есть, до тех пор, покаbinaryFun!pred(haystack.front, needle)не будетtrue. Если такой позиции не существует, возвращается пустойhaystack.
- См. также:
-
findAdjacent,findAmong,findSkip,findSplit,startsWith
- Примеры:
-
import std.range.primitives; auto arr = [1, 2, 4, 4, 4, 4, 5, 6, 9]; writeln(arr.find(4)); // [4, 4, 4, 4, 5, 6, 9] writeln(arr.find(1)); // arr writeln(arr.find(9)); // [9] writeln(arr.find!((a, b) => a > b)(4)); // [5, 6, 9] writeln(arr.find!((a, b) => a < b)(4)); // arr assert(arr.find(0).empty); assert(arr.find(10).empty); assert(arr.find(8).empty); writeln(find("hello, world", ',')); // ", world"
- Примеры:
- Регистронезависимый поиск строки
import std.range.primitives; import std.uni : toLower; string[] s = ["Hello", "world", "!"]; writeln(s.find!((a, b) => toLower(a) == b)("hello")); // s
- Примеры:
-
auto arr = [ 1, 2, 3, 4, 1 ]; writeln(find!("a > 2")(arr)); // [3, 4, 1] // with predicate alias bool pred(int x) { return x + 1 > 1.5; } writeln(find!(pred)(arr)); // arr
- Примеры:
-
import std.container : SList; import std.range.primitives : empty; import std.typecons : Tuple; assert(find("hello, world", "World").empty); writeln(find("hello, world", "wo")); // "world" writeln([1, 2, 3, 4].find(SList!int(2, 3)[])); // [2, 3, 4] alias C = Tuple!(int, "x", int, "y"); auto a = [C(1,0), C(2,0), C(3,1), C(4,0)]; writeln(a.find!"a.x == b"([2, 3])); // [C(2, 0), C(3, 1), C(4, 0)] writeln(a[1 .. $].find!"a.x == b"([2, 3])); // [C(2, 0), C(3, 1), C(4, 0)]
- Tuple!(Range, size_t) find(alias pred = "a == b", Range, Ranges...)(Range haystack, Ranges needles)
Constraints: if (Ranges.length > 1 && is(typeof(startsWith!pred(haystack, needles)))); -
Находит два или более
needlesвhaystack. Предикатpredиспользуется для сравнения элементов. По умолчанию элементы сравниваются на равенство.- Параметры:
pred Предикат для сравнения элементов. Range haystackЦель поиска. Должен быть диапазон ввода. Если любой из needlesявляется диапазоном с элементами, сравнимыми с элементами вhaystack, тоhaystackдолжен быть прямолинейным диапазоном, чтобы поиск мог отступать назад.Ranges needlesОдин или несколько элементов поиска. Каждый из needlesдолжен быть либо сравним с одним элементом вhaystack, либо сам быть прямолинейным диапазоном с элементами, сравнимыми с элементами вhaystack.
- Возвращаемое значение:
- Кортеж, содержащий
haystack, позицию совпадения с одним из искомых элементов, а также индекс совпавшего элемента вneedles(0, если ни один изneedlesне совпал, 1, если совпалneedles[0], 2, если совпалneedles[1], и так далее). Первый искомый элемент, который будет найден, будет тем, который совпадёт. Если несколько искомых элементов найдены в одном и том же месте в диапазоне, то кратчайший из них является совпавшим (если несколько искомых элементов одинаковой длины найдены в одном и том же месте (например,"a"и'a'), то совпадает левее них в списке аргументов). Связь междуhaystackиneedlesозначает, что можно, например, искать отдельныеintили массивыintв массивеint. Кроме того, если элементы сравнимы по отдельности, разрешены поиски гетерогенных типов: заdouble[]может быть найденоintилиshort[], и наоборот, заlongможет быть найденоfloatилиdouble[]. Это позволяет выполнять эффективный поиск без необходимости приведения одного из сторон сравнения к типу другой стороны. Сложность поиска составляет Ο(haystack.length * max(needles.length)). (Для искомых элементов, представляющих собой отдельные элементы, длина считается равной 1.) Стратегия поиска нескольких поддиапазонов одновременно максимально использует кэш, перемещаясь вhaystackкак можно реже.
- Примеры:
-
import std.typecons : tuple; int[] a = [ 1, 4, 2, 3 ]; writeln(find(a, 4)); // [4, 2, 3] writeln(find(a, [1, 4])); // [1, 4, 2, 3] writeln(find(a, [1, 3], 4)); // tuple([4, 2, 3], 2) // Mixed types allowed if comparable writeln(find(a, 5, [1.2, 3.5], 2.0)); // tuple([2, 3], 3)
- RandomAccessRange find(RandomAccessRange, alias pred, InputRange)(RandomAccessRange haystack, scope BoyerMooreFinder!(pred, InputRange) needle);
-
Эффективно находит
needleвhaystackс помощью алгоритма Бойера-Мура.- Параметры:
RandomAccessRange haystackДиапазон с произвольным доступом, имеющий длину и возможность срезов. BoyerMooreFinder!(pred, InputRange) needleBoyerMooreFinder.
- Возвращает:
-
haystackсдвинутый так, чтоneedleявляется его префиксом (если такая позиция не существует, возвращаетhaystackсдвинутый до конца).
- Примеры:
-
import std.range.primitives : empty; int[] a = [ -1, 0, 1, 2, 3, 4, 5 ]; int[] b = [ 1, 2, 3 ]; writeln(find(a, boyerMooreFinder(b))); // [1, 2, 3, 4, 5] assert(find(b, boyerMooreFinder(a)).empty);
- шаблон canFind(псевдоним pred = "a == b")
-
Удобная функция. Похожа на функцию find, но возвращает только результат поиска (успешно или нет).
- См. также:
-
std.algorithm.comparison.amongдля проверки значения по отношению к нескольким вариантам.
- Примеры:
-
writeln(canFind([0, 1, 2, 3], 2)); // true assert(canFind([0, 1, 2, 3], [1, 2], [2, 3])); writeln(canFind([0, 1, 2, 3], [1, 2], [2, 3])); // 1 assert(canFind([0, 1, 2, 3], [1, 7], [2, 3])); writeln(canFind([0, 1, 2, 3], [1, 7], [2, 3])); // 2 writeln(canFind([0, 1, 2, 3], 4)); // false assert(!canFind([0, 1, 2, 3], [1, 3], [2, 4])); writeln(canFind([0, 1, 2, 3], [1, 3], [2, 4])); // 0
- Примеры:
- Пример использования пользовательского предиката. Обратите внимание, что иголка появляется как второй аргумент предиката.
auto words = [ "apple", "beeswax", "cardboard" ]; assert(!canFind(words, "bees")); assert( canFind!((string a, string b) => a.startsWith(b))(words, "bees"));
- Примеры:
- Поиск нескольких элементов в массиве элементов (поиск иглы в стоге сена)
string s1 = "aaa111aaa"; string s2 = "aaa222aaa"; string s3 = "aaa333aaa"; string s4 = "aaa444aaa"; const hay = [s1, s2, s3, s4]; assert(hay.canFind!(e => (e.canFind("111", "222"))));
- bool canFind(Range)(Range haystack)
Ограничения: если (is(typeof(find!pred(haystack)))); -
Возвращает
trueтогда и только тогда, когда любое значениеvв входящем диапазонеrangeудовлетворяет предикатуpred. Выполняет (по максимуму) Ο(haystack.length) вычисленийpred. - bool canFind(Range, Element)(Range haystack, scope Element needle)
Ограничения: если (is(typeof(find!pred(haystack, needle)))); -
Возвращает
trueтогда и только тогда, когдаneedleможно найти вrange. Выполняет Ο(haystack.length) вычисленийpred. - size_t canFind(Range, Ranges...)(Range haystack, scope Ranges needles)
Ограничения: если (Ranges.length > 1 && allSatisfy!(isForwardRange, Ranges) && is(typeof(find!pred(haystack, needles)))); -
Возвращает индекс (с учётом начала с 1) первого найденного элемента needle в
haystack. Если ни один элемент needle не найден, то возвращается0.Таким образом, при использовании непосредственно в условии оператора if или цикла, результат будет
trueесли один из элементов needle найден иfalseесли ни один не найден, в то время как если результат используется где-то ещё, его можно привести к типуboolдля того же эффекта или использовать для получения того, какой элемент needle был найден первым, не имея дело с кортежем, которыйLREF findвозвращает для той же операции.
- Range findAdjacent(псевдоним pred = "a == b", Range)(Range r)
Ограничения: если (isForwardRange!Range); -
Сдвигает
rдо тех пор, пока не найдёт первые два смежных элементаa,bудовлетворяющие условиюpred(a, b). Выполняет Ο(r.length) вычисленийpred.- Параметры:
pred Предикат для проверки. Range rдиапазон следования для поиска.
- Возвращает:
-
rсдвинутый до первой пары смежных элементов, удовлетворяющих заданному предикату. Если таких элементов нет, возвращаетrсдвинутый до конца.
- См. также:
- STL's
adjacent_find
- Примеры:
-
int[] a = [ 11, 10, 10, 9, 8, 8, 7, 8, 9 ]; auto r = findAdjacent(a); writeln(r); // [10, 10, 9, 8, 8, 7, 8, 9] auto p = findAdjacent!("a < b")(a); writeln(p); // [7, 8, 9]
- InputRange findAmong(псевдоним pred = "a == b", InputRange, ForwardRange)(InputRange seq, ForwardRange choices)
Ограничения: если (isInputRange!InputRange && isForwardRange!ForwardRange); -
Ищет в данном диапазоне элемент, соответствующий одному из заданных вариантов.
Сдвигает
seqвызываяseq.popFrontдо тех пор, покаfind!(pred)(choices, seq.front)не будетtrue, илиseqне станет пустым. Выполняет Ο(seq.length * choices.length) вычисленийpred.- Параметры:
pred Предикат для определения соответствия. InputRange seqДиапазон входных данных для поиска. ForwardRange choicesДиапазон следования возможных вариантов.
- Возвращает:
-
seqсдвинутый до первого соответствующего элемента, или пустой, если соответствующих элементов нет.
- См. также:
-
find,algorithm.comparison.among.std
- Примеры:
-
int[] a = [ -1, 0, 1, 2, 3, 4, 5 ]; int[] b = [ 3, 1, 2 ]; writeln(findAmong(a, b)); // a[2 .. $]
- bool findSkip(псевдоним pred = "a == b", R1, R2)(ref R1 haystack, R2 needle)
Ограничения: если (isForwardRange!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack.front, needle.front))));
size_t findSkip(псевдоним pred, R1)(ref R1 haystack)
Ограничения: если (isForwardRange!R1 && ifTestable!(typeof(haystack.front), unaryFun!pred)); -
Находит
needleвhaystackи позиционируетhaystackсразу после первого вхожденияneedle.Если иголка не задана,
haystackсдвигается до тех пор, покаpredвозвращаетtrue. Аналогично, стог сена позиционируется таким образом, чтоpredвозвращаетfalseдляhaystack.front.- Параметры:
R1 haystackДиапазон следования для поиска. R2 needleДиапазон следования для поиска. pred Пользовательский предикат для сравнения стога сена и иголки.
- Возвращает:
-
trueесли иголка была найдена, в этом случаеhaystackпозиционируется после конца первого вхожденияneedle; в противном случаеfalse, оставляяhaystackбез изменений. Если иголка не задана, возвращает количество раз, когдаpred(haystack.front)возвращает true.
- См. также:
find
- Примеры:
-
import std.range.primitives : empty; // Needle is found; s is replaced by the substring following the first // occurrence of the needle. string s = "abcdef"; assert(findSkip(s, "cd") && s == "ef"); // Needle is not found; s is left untouched. s = "abcdef"; assert(!findSkip(s, "cxd") && s == "abcdef"); // If the needle occurs at the end of the range, the range is left empty. s = "abcdef"; assert(findSkip(s, "def") && s.empty);
- Примеры:
-
import std.ascii : isWhite; string s = " abc"; assert(findSkip!isWhite(s) && s == "abc"); assert(!findSkip!isWhite(s) && s == "abc"); s = " "; writeln(findSkip!isWhite(s)); // 2
- auto findSplit(псевдоним pred = "a == b", R1, R2)(R1 haystack, R2 needle)
Ограничения: если (isForwardRange!R1 && isForwardRange!R2);
auto findSplitBefore(псевдоним pred = "a == b", R1, R2)(R1 haystack, R2 needle)
Ограничения: если (isForwardRange!R1 && isForwardRange!R2);
auto findSplitAfter(псевдоним pred = "a == b", R1, R2)(R1 haystack, R2 needle)
Ограничения: если (isForwardRange!R1 && isForwardRange!R2);
-
Эти функции находят первое вхождение
needleвhaystackи затем разбиваютhaystackследующим образом.findSplitвозвращает кортежresultсодержащий три диапазона.result[0]— это частьhaystackпередneedle,result[1]— это частьhaystackкоторая соответствуетneedle, аresult[2]— это частьhaystackпосле совпадения. Еслиneedleне найдено,result[0]охватываетhaystackцеликом, аresult[1]иresult[2]пустые.
findSplitBeforeвозвращает кортежresultсодержащий два диапазона.result[0]— это частьhaystackпередneedle, аresult[1]— это остатокhaystackначиная с совпадения. Еслиneedleне найдено,result[0]охватываетhaystackцеликом, аresult[1]пусто.
findSplitAfterвозвращает кортежresultсодержащий два диапазона.result[0]— это частьhaystackвплоть до и включая совпадение, аresult[1]— это остатокhaystackначиная после совпадения. Еслиneedleне найдено,result[0]пусто, аresult[1]— этоhaystack.
Во всех случаях конкатенация возвращаемых диапазонов охватывает весьhaystack.
Еслиhaystack— это диапазон с произвольным доступом, все три компонента кортежа имеют тот же тип, что иhaystack. В противном случае,haystackдолжен быть диапазоном вперёд, а типresult[0]иresult[1]такой же, как уstd.range.takeExactly.- Параметры:
pred Предикат для сравнения искомого элемента с исходным диапазоном. R1 haystackДиапазон для поиска. R2 needleЧто искать.
- Возвращает:
- Подтип
Tuple!()из разбитых частейhaystack(см. подробности выше). Этот подтипTuple!()имеетopCastопределён дляbool. ЭтотopCastвозвращаетtrueкогда разделительneedleнайден иfalseв противном случае.
- См. также:
find
- Примеры:
- Возвращение подтипа
std.typecons.Tupleпозволяет использовать следующее удобное выражение:// findSplit returns a triplet if (auto split = "dlang-rocks".findSplit("-")) { writeln(split[0]); // "dlang" writeln(split[1]); // "-" writeln(split[2]); // "rocks" } else assert(0); // works with const aswell if (const split = "dlang-rocks".findSplit("-")) { writeln(split[0]); // "dlang" writeln(split[1]); // "-" writeln(split[2]); // "rocks" } else assert(0);
- Примеры:
-
import std.range.primitives : empty; auto a = "Carl Sagan Memorial Station"; auto r = findSplit(a, "Velikovsky"); import std.typecons : isTuple; static assert(isTuple!(typeof(r.asTuple))); static assert(isTuple!(typeof(r))); assert(!r); writeln(r[0]); // a assert(r[1].empty); assert(r[2].empty); r = findSplit(a, " "); writeln(r[0]); // "Carl" writeln(r[1]); // " " writeln(r[2]); // "Sagan Memorial Station" if (const r1 = findSplitBefore(a, "Sagan")) { assert(r1); writeln(r1[0]); // "Carl " writeln(r1[1]); // "Sagan Memorial Station" } if (const r2 = findSplitAfter(a, "Sagan")) { assert(r2); writeln(r2[0]); // "Carl Sagan" writeln(r2[1]); // " Memorial Station" }
- Примеры:
- Используйте
std.range.onlyдля поиска отдельных элементов:import std.range : only; writeln([1, 2, 3, 4].findSplitBefore(only(3))[0]); // [1, 2]
- Tuple!(ElementType!Range, size_t) minCount(alias pred = "a < b", Range)(Range range)
Constraints: if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front))));
Tuple!(ElementType!Range, size_t) maxCount(alias pred = "a < b", Range)(Range range)
Constraints: if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front)))); -
Вычисляет минимум (соответственно максимум)
rangeвместе с количеством его вхождений. Формально, минимум — это значениеxвrangeтакое, чтоpred(a, x)меньше или равноfalseдля всех значенийaвrange. Обратно, максимум — это значениеxвrangeтакое, чтоpred(x, a)больше или равноfalseдля всех значенийaвrange(обратите внимание на переставленные аргументы вpred).Эти функции могут быть использованы для вычисления произвольных экстремумов, выбрав подходящее
pred. Для корректной работыpredдолжен быть строго частичным порядком, т. е. транзитивным (еслиpred(a, b) && pred(b, c)тоpred(a, c)) и иррефлексивным (pred(a, a)не равноfalse). Свойство трихотомии неравенства не требуется: эти алгоритмы рассматривают элементыaиbравными (для подсчёта), еслиpredпомещает их в один класс эквивалентности, т. е.!pred(a, b) && !pred(b, a).- Параметры:
pred Предикат упорядочения для определения экстремума (минимума или максимума). Range rangeДиапазон входных данных для подсчёта.
- Возвращает:
- Минимальный, соответственно максимальный элемент диапазона вместе с количеством его вхождений в диапазон.
- Ограничения
- Если хотя бы один из аргументов — NaN, результат неопределён. См.
std.algorithm.searching.maxElementдля примеров, как обойти NaN.
- Исключения:
-
Exceptionеслиrange.empty.
- См. также:
-
std.algorithm.comparison.min,minIndex,minElement,minPos
- Примеры:
-
import std.conv : text; import std.typecons : tuple; int[] a = [ 2, 3, 4, 1, 2, 4, 1, 1, 2 ]; // Minimum is 1 and occurs 3 times writeln(a.minCount); // tuple(1, 3) // Maximum is 4 and occurs 2 times writeln(a.maxCount); // tuple(4, 2)
- auto minElement(alias map = (a) => a, Range)(Range r)
Constraints: if (isInputRange!Range && !isInfinite!Range);
auto minElement(alias map = (a) => a, Range, RangeElementType = ElementType!Range)(Range r, RangeElementType seed)
Constraints: if (isInputRange!Range && !isInfinite!Range && !is(CommonType!(ElementType!Range, RangeElementType) == void)); -
Итерирует переданный диапазон и возвращает минимальный элемент. Можно передать пользовательскую функцию отображения для
map. В других языках это иногда называетсяargmin.- Сложность
- O(n) Необходимо точно
n - 1сравнений.
- Параметры:
map Пользовательский аксессор для ключа сравнения Range rДиапазон, из которого будет выбран минимальный элемент RangeElementType seedПользовательское начальное значение для использования в качестве начального элемента
- Возвращает:
- Минимальный элемент переданного диапазона.
- Примечание
- Если хотя бы один из аргументов — NaN, результат неопределён.
std.algorithm.iteration.filterиstd.math.isNaNдля их удаления перед применением minElement. Добавьте подходящее начальное значение, чтобы избежать сообщений об ошибках, если все элементы — NaN:<range>.filter!(a=>!a.isNaN).minElement(<seed>);
Если вы хотите получить NaN в качестве результата, если в диапазоне присутствует NaN, вы можете использоватьstd.algorithm.iteration.foldиstd.math.isNaN:<range>.fold!((a,b)=>a.isNaN || b.isNaN ? real.nan : a < b ? a : b);
- См. также:
-
maxElement,std.algorithm.comparison.min,minCount,minIndex,minPos
- Примеры:
-
import std.range : enumerate; import std.typecons : tuple; writeln([2, 7, 1, 3].minElement); // 1 // allows to get the index of an element too writeln([5, 3, 7, 9].enumerate.minElement!"a.value"); // tuple(1, 3) // any custom accessor can be passed writeln([[0, 4], [1, 2]].minElement!"a[1]"); // [1, 2] // can be seeded int[] arr; writeln(arr.minElement(1)); // 1
- auto maxElement(alias map = (a) => a, Range)(Range r)
Constraints: if (isInputRange!Range && !isInfinite!Range);
auto maxElement(alias map = (a) => a, Range, RangeElementType = ElementType!Range)(Range r, RangeElementType seed)
Constraints: if (isInputRange!Range && !isInfinite!Range && !is(CommonType!(ElementType!Range, RangeElementType) == void)); -
Итерирует переданный диапазон и возвращает максимальный элемент. Можно передать пользовательскую функцию отображения для
map. В других языках это иногда называетсяargmax.- Сложность
- O(n) Необходимо точно
n - 1сравнений.
- Параметры:
map Пользовательский аксессор для ключа сравнения Range rДиапазон, из которого будет выбран максимальный элемент RangeElementType seedПользовательское начальное значение для использования в качестве начального элемента
- Возвращает:
- Максимальный элемент переданного диапазона.
- Примечание
- Если хотя бы один из аргументов — NaN, результат неопределён. См.
std.algorithm.searching.minElementдля примеров, как обойти NaN.
- См. также:
-
minElement,std.algorithm.comparison.max,maxCount,maxIndex,maxPos
- Примеры:
-
import std.range : enumerate; import std.typecons : tuple; writeln([2, 1, 4, 3].maxElement); // 4 // allows to get the index of an element too writeln([2, 1, 4, 3].enumerate.maxElement!"a.value"); // tuple(2, 4) // any custom accessor can be passed writeln([[0, 4], [1, 2]].maxElement!"a[1]"); // [0, 4] // can be seeded int[] arr; writeln(arr.minElement(1)); // 1
- Range minPos(alias pred = "a < b", Range)(Range range)
Constraints: if (isForwardRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front))));
Range maxPos(alias pred = "a < b", Range)(Range range)
Constraints: if (isForwardRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front))));
-
Вычисляет поддиапазон
range, начинающийся с первого вхождения минимального (соответственно, максимального) элементаrangeи заканчивающийся так же, как иrange, или пустой диапазон, еслиrangeпуст.Формально, минимальное значение — это значение
xвrange, такое чтоpred(a, x)являетсяfalseдля всех значенийaвrange. Обратно, максимальное значение — это значениеxвrange, такое чтоpred(x, a)являетсяfalseдля всех значенийaвrange(обратите внимание на переставленные аргументы вpred).
Эти функции могут использоваться для вычисления произвольных экстремумов, соответствующим образом выбравpred. Для корректной работыpredдолжно быть строгим частичным порядком, то есть транзитивным (еслиpred(a, b) && pred(b, c)тоpred(a, c)) и иррефлексивным (pred(a, a)не равноfalse).- Параметры:
pred Предикат упорядочения, используемый для определения экстремального элемента (минимального или максимального). Диапазон rangeПрямой диапазон для поиска.
- Возвращаемое значение:
- Позиция минимального (соответственно, максимального) элемента прямого диапазона
range, т.е. поддиапазонrange, начинающийся с позиции наименьшего (соответственно, наибольшего) элемента и заканчивающийся так же, как иrange.
- Ограничения
- Если хотя бы один из аргументов — NaN, результат является неопределённым. См.
std.algorithm.searching.maxElementдля примеров обработки NaN.
- См. также:
-
std.algorithm.comparison.max,minCount,minIndex,minElement
- Примеры:
-
int[] a = [ 2, 3, 4, 1, 2, 4, 1, 1, 2 ]; // Minimum is 1 and first occurs in position 3 writeln(a.minPos); // [1, 2, 4, 1, 1, 2] // Maximum is 4 and first occurs in position 2 writeln(a.maxPos); // [4, 1, 2, 4, 1, 1, 2]
- ptrdiff_t minIndex(alias pred = "a < b", Range)(Range range)
Constraints: if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front)))); -
Вычисляет индекс первого вхождения минимального элемента
range.- Параметры:
pred Предикат упорядочения, используемый для определения минимального элемента. Диапазон rangeвходной диапазон для поиска.
- Сложность
- Ο(
range.length) Требуется ровноrange.length - 1сравнений.
- Возвращаемое значение:
- Индекс первого вхождения минимального элемента в
range. Еслиrangeпуст, возвращается -1.
- Ограничения
- Если хотя бы один из аргументов — NaN, результат является неопределённым. См.
std.algorithm.searching.maxElementдля примеров обработки NaN.
- См. также:
-
maxIndex,std.algorithm.comparison.min,minCount,minElement,minPos
- Примеры:
-
int[] a = [2, 3, 4, 1, 2, 4, 1, 1, 2]; // Minimum is 1 and first occurs in position 3 writeln(a.minIndex); // 3 // Get maximum index with minIndex writeln(a.minIndex!"a > b"); // 2 // Range is empty, so return value is -1 int[] b; writeln(b.minIndex); // -1 // Works with more custom types struct Dog { int age; } Dog[] dogs = [Dog(10), Dog(5), Dog(15)]; writeln(dogs.minIndex!"a.age < b.age"); // 1
- ptrdiff_t maxIndex(alias pred = "a < b", Range)(Range range)
Constraints: if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range.front, range.front)))); -
Вычисляет индекс первого вхождения максимального элемента
range.- Сложность
- Ο(
range) Требуется ровноrange.length - 1сравнений.
- Параметры:
pred Предикат упорядочения, используемый для определения максимального элемента. Диапазон rangeвходной диапазон для поиска.
- Возвращаемое значение:
- Индекс первого вхождения максимального элемента в
range. Еслиrangeпуст, возвращается -1.
- Ограничения
- Если хотя бы один из аргументов — NaN, результат является неопределённым. См.
std.algorithm.searching.maxElementдля примеров обработки NaN.
- См. также:
-
minIndex,std.algorithm.comparison.max,maxCount,maxElement,maxPos
- Примеры:
-
// Maximum is 4 and first occurs in position 2 int[] a = [2, 3, 4, 1, 2, 4, 1, 1, 2]; writeln(a.maxIndex); // 2 // Empty range int[] b; writeln(b.maxIndex); // -1 // Works with more custom types struct Dog { int age; } Dog[] dogs = [Dog(10), Dog(15), Dog(5)]; writeln(dogs.maxIndex!"a.age < b.age"); // 1
- template skipOver(alias pred = (a, b) => a == b)
-
Пропускает начальную часть первого заданного диапазона (
haystack) что соответствует любому из дополнительных диапазонов (needles) полностью, или, если второй диапазон не задан, пропускает элементы, удовлетворяющие pred. Ничего не делает, если соответствия нет.- Параметры:
pred Предикат, определяющий соответствие элементов из каждого соответствующего диапазона. По умолчанию — равенство "a == b".
- Примеры:
-
import std.algorithm.comparison : equal; auto s1 = "Hello world"; assert(!skipOver(s1, "Ha")); writeln(s1); // "Hello world" assert(skipOver(s1, "Hell") && s1 == "o world", s1); string[] r1 = ["abc", "def", "hij"]; dstring[] r2 = ["abc"d]; assert(!skipOver!((a, b) => a.equal(b))(r1, ["def"d]), r1[0]); writeln(r1); // ["abc", "def", "hij"] assert(skipOver!((a, b) => a.equal(b))(r1, r2)); writeln(r1); // ["def", "hij"]
- Примеры:
-
import std.ascii : isWhite; import std.range.primitives : empty; auto s2 = "\t\tvalue"; auto s3 = ""; auto s4 = "\t\t\t"; assert(s2.skipOver!isWhite && s2 == "value"); assert(!s3.skipOver!isWhite); assert(s4.skipOver!isWhite && s3.empty);
- Примеры:
- Многоаргументный skipOver
auto s = "Hello world"; assert(!skipOver(s, "hello", "HellO")); writeln(s); // "Hello world" // the range is skipped over the longest matching needle is skipped assert(skipOver(s, "foo", "hell", "Hello ")); writeln(s); // "world"
- Примеры:
-
import std.algorithm.comparison : equal; auto s1 = "Hello world"; assert(!skipOver(s1, 'a')); writeln(s1); // "Hello world" assert(skipOver(s1, 'H') && s1 == "ello world"); string[] r = ["abc", "def", "hij"]; dstring e = "abc"d; assert(!skipOver!((a, b) => a.equal(b))(r, "def"d)); writeln(r); // ["abc", "def", "hij"] assert(skipOver!((a, b) => a.equal(b))(r, e)); writeln(r); // ["def", "hij"] auto s2 = ""; assert(!s2.skipOver('a'));
- Примеры:
- Частичная инициализация
import std.ascii : isWhite; import std.range.primitives : empty; alias whitespaceSkiper = skipOver!isWhite; auto s2 = "\t\tvalue"; auto s3 = ""; auto s4 = "\t\t\t"; assert(whitespaceSkiper(s2) && s2 == "value"); assert(!whitespaceSkiper(s2)); assert(whitespaceSkiper(s4) && s3.empty);
- bool skipOver(Haystack, Needles...)(ref Haystack haystack, Needles needles)
Constraints: if (is(typeof(binaryFun!pred(haystack.front, needles[0].front))) && isForwardRange!Haystack && allSatisfy!(isInputRange, Needles) && !is(CommonType!(staticMap!(ElementType, staticMap!(Unqual, Needles))) == void));
bool skipOver(R)(ref R r1)
Constraints: if (isForwardRange!R && ifTestable!(typeof(r1.front), unaryFun!pred));
bool skipOver(R, Es...)(ref R r, Es es)
Constraints: if (isInputRange!R && is(typeof(binaryFun!pred(r.front, es[0])))); -
- Параметры:
Haystack haystackПрямой диапазон для перемещения вперёд. Needles needlesВводные диапазоны, представляющие префикс r1для пропуска.Es esЭлемент для соответствия.
- Возвращаемое значение:
-
trueесли префиксhaystackсоответствует любому диапазонуneedlesполностью илиpredистинно, иhaystackпродвинут до точки за этим сегментом; в противном случае ложь, иhaystackостаётся на своём исходном месте.
- Примечание
- По определению, пустые диапазоны соответствуют полностью, и если
needlesсодержит пустой диапазон,skipOverвернётtrue.
- uint startsWith(alias pred = (a, b) => a == b, Range, Needles...)(Range doesThisStart, Needles withOneOfThese)
Constraints: if (isInputRange!Range && (Needles.length > 1) && is(typeof(.startsWith!pred(doesThisStart, withOneOfThese[0])) : bool) && is(typeof(.startsWith!pred(doesThisStart, withOneOfThese[1..$])) : uint));
bool startsWith(alias pred = "a == b", R1, R2)(R1 doesThisStart, R2 withThis)
Constraints: if (isInputRange!R1 && isInputRange!R2 && is(typeof(binaryFun!pred(doesThisStart.front, withThis.front)) : bool));
bool startsWith(alias pred = "a == b", R, E)(R doesThisStart, E withThis)
Constraints: if (isInputRange!R && is(typeof(binaryFun!pred(doesThisStart.front, withThis)) : bool));
bool startsWith(alias pred, R)(R doesThisStart)
Constraints: if (isInputRange!R && ifTestable!(typeof(doesThisStart.front), unaryFun!pred)); -
Проверяет, начинается ли заданный входной диапазон с (одного из) заданных иголок или, если иглы не заданы, если его первый элемент удовлетворяет предикату
pred.- Параметры:
pred Предикат для сравнения элементов стога и иглы(л). Обязателен, если иглы не заданы. Диапазон doesThisStartВводной диапазон для проверки. Needles withOneOfTheseИглы, по которым проверяется диапазон, которые могут быть отдельными элементами или входными диапазонами элементов. R2 withThisЕдинственная игла для проверки, которая может быть либо отдельным элементом, либо входным диапазоном элементов.
- Возвращаемое значение:
- 0, если игла(ы) не встречаются в начале заданного диапазона; в противном случае позиция соответствующей иглы, то есть 1, если диапазон начинается с
withOneOfThese[0], 2, если он начинается сwithOneOfThese[1], и так далее. В случае, когдаdoesThisStartначинается с нескольких диапазонов или элементов вwithOneOfThese, соответствует наиболее короткому. (Если есть два совпадающих диапазона одинаковой длины (например,"a"и'a'), то соответствует самый левый из них в списке аргументов). В случае, когда параметры игл не заданы, возвращаетtrueесли первый элементdoesThisStartудовлетворяет предикатуpred.
- Примеры:
-
import std.ascii : isAlpha; assert("abc".startsWith!(a => a.isAlpha)); assert("abc".startsWith!isAlpha); assert(!"1ab".startsWith!(a => a.isAlpha)); assert(!"".startsWith!(a => a.isAlpha)); import std.algorithm.comparison : among; assert("abc".startsWith!(a => a.among('a', 'b') != 0)); assert(!"abc".startsWith!(a => a.among('b', 'c') != 0)); assert(startsWith("abc", "")); assert(startsWith("abc", "a")); assert(!startsWith("abc", "b")); writeln(startsWith("abc", 'a', "b")); // 1 writeln(startsWith("abc", "b", "a")); // 2 writeln(startsWith("abc", "a", "a")); // 1 writeln(startsWith("abc", "ab", "a")); // 2 writeln(startsWith("abc", "x", "a", "b")); // 2 writeln(startsWith("abc", "x", "aa", "ab")); // 3 writeln(startsWith("abc", "x", "aaa", "sab")); // 0 writeln(startsWith("abc", "x", "aaa", "a", "sab")); // 3 import std.typecons : Tuple; alias C = Tuple!(int, "x", int, "y"); assert(startsWith!"a.x == b"([ C(1,1), C(1,2), C(2,2) ], [1, 1])); writeln(startsWith!"a.x == b"([C(1, 1), C(2, 1), C(2, 2)], [1, 1], [1, 2], [1, 3])); // 2
- alias OpenRight = std.typecons.Flag!"openRight".Flag;
-
Спецификатор опции интервала для
until(ниже) и других.Если установлено значение
OpenRight.yes, то интервал открыт справа (последний элемент не включается).
В противном случае, если установлено значениеOpenRight.no, то интервал закрыт справа (последний элемент включается). - Until!(pred, Range, Sentinel) until(alias pred = "a == b", Range, Sentinel)(Range range, Sentinel sentinel, OpenRight openRight = Yes.openRight)
Ограничения: если (!is(Sentinel == OpenRight));
Until!(pred, Range, void) until(alias pred, Range)(Range range, OpenRight openRight = Yes.openRight);
struct Until(alias pred, Range, Sentinel) if (isInputRange!Range); -
Лениво итерирует
rangeдо тех пор, пока не будет найден элементe, для которогоpred(e, sentinel)истинно.Это аналогично
takeWhileв других языках.- Параметры:
pred Предикат, определяющий, когда следует остановиться. Range rangeВходной диапазон для итерации. Sentinel sentinelЭлемент, на котором следует остановиться. OpenRight openRightОпределяет, следует ли включать элемент, для которого заданный предикат истинен, в результирующий диапазон ( No.openRight), или нет (Yes.openRight).
- Возвращает:
- Входной диапазон, который итерирует элементы исходного диапазона, но останавливается, когда указанный предикат становится истинным. Если исходный диапазон является диапазоном с однонаправленной итерацией или выше, этот диапазон также будет с однонаправленной итерацией.
- Примеры:
-
import std.algorithm.comparison : equal; import std.typecons : No; int[] a = [ 1, 2, 4, 7, 7, 2, 4, 7, 3, 5]; assert(equal(a.until(7), [1, 2, 4])); assert(equal(a.until(7, No.openRight), [1, 2, 4, 7]));
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_algorithm_searching.html