std.algorithm.searching
関数名 | 説明 |
---|---|
all | all!"a > 0"([1, 2, 3, 4]) true を返す。なぜなら、すべての要素が 正だから |
any | any!"a > 0"([1, 2, -3, -4]) true を返す。少なくとも1つの要素が 正であるため |
balancedParens | balancedParens("((1 + 1) / 2)", '(', ')') true を返す。 文字列がバランスした括弧を持つため。 |
boyerMooreFinder | find("hello world", boyerMooreFinder("or")) Boyer-Mooreアルゴリズムを使用して"orld"を返す。 |
canFind | canFind("hello world", "or") true を返す。 |
count | すべての要素、または特定の要素、あるいはサブレンジに一致する要素を数える。 count([1, 2, 1]) 3 を返し、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]) 2つの等しい隣接要素から始まる部分範囲を返す。 すなわち、[3, 3, 4] を返す。 |
findAmong | findAmong("abcd", "qcx") 'c' は"qcx" の中にあるため、"cd" が返される。 |
findSkip | a = "abcde" の場合、findSkip(a, "x") はfalse を返し、a は変更しない。一方、findSkip(a, "c") はaを"de" に進め、true を返す。 |
findSplit | findSplit("abcdefg", "de") 3つの範囲からなるタプル"abc" 、"de" 、"fg" を返す。 |
findSplitAfter | findSplitAfter("abcdefg", "de") 2つの範囲からなるタプル および を返す。"abcde" "fg" |
findSplitBefore | findSplitBefore("abcdefg", "de") 2つの範囲からなるタプルを返す。"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 | 範囲の最小要素のインデックス。minIndex([3, 4, 1, 2]) は2 を返す。 |
maxIndex | 範囲の最大要素のインデックス。maxIndex([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 | 特定の値が見つかるまで、範囲を遅延処理で繰り返し処理する。 |
- template
all
(alias pred = "a") - すべての要素がpred を満たしているかどうかを確認する。Examples:
assert( all!"a & 1"([1, 3, 5, 7, 9])); assert(!all!"a & 1"([1, 2, 3, 5, 7, 9]));
Examples: また、条件文でその項目がtrueまたはfalseと評価できる場合は、述語なしでも使用できる。これは、範囲内のすべての要素がtrueであることを素早く評価する便利な方法である。入力された範囲が真である場合にのみ、xml-ph-0000@deepl.internal を返す。all
また、条件文でその項目が trueまたはfalseと評価できる場合は、述語なしでも使用できる。これは、 範囲内のすべての要素がtrueであることを素早く評価する便利な方法である。int[3] vals = [5, 3, 18]; assert( all(vals[]));
truetrue- bool
all
(Range)(Rangerange
)
if (isInputRange!Range && (__traits(isTemplate, pred) || is(typeof(unaryFun!pred(range
.front))))); - true 入力範囲が空の場合、または
range
空である か、または、見つかったすべての値がrange
述語pred を満たす場合にのみ、 を返す。pred の評価を、(最大で)Ο(range.length)回実行する。
- template
any
(alias pred = "a") - いずれかの要素がpred を満たしているかどうかを確認する。!to can be usedだ
any
いずれの要素もpredを満たさないことを確認するために使用できる。 これは、他の言語ではexists と呼ばれることもある。Examples:import std.ascii : isWhite; assert( all!(any!isWhite)(["a a", "b b"])); assert(!any!(all!isWhite)(["a a", "b b"]));
Examples: また、条件文でその項目がtrueまたはfalseと評価できる場合は、述語なしでも使用できる。入力された範囲が真と評価される場合にのみ、xml-ph-0000@deepl.internal を返す。any
また、条件文でその項目が trueまたはfalseと評価できる場合は、述語なしでも使用できる。 !any
これは、 範囲内の要素がすべて trueint[3] vals1 = [0, 0, 0]; assert(!any(vals1[])); //vals1のどれもが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[]));
alsoも- bool
any
(Range)(Rangerange
)
if (isInputRange!Range && (__traits(isTemplate, pred) || is(typeof(unaryFun!pred(range
.front))))); - true 入力された範囲が
range
空ではなく、 かつ、その範囲に含まれるいずれかの値がrange
述語を満たす 場合のみ、pred を返す。pred の評価を(多くても)Ο(range.length)回だけ行う。
- bool
balancedParens
(Range, E)(Ranger
, ElPar
, ErPar
, size_tmaxNestingLevel
= size_t.max)
if (isInputRange!Range && is(typeof(r
.front ==lPar
))); r
「バランスが取れた括弧」になっているか、すなわちlPar
対応するインスタンスで閉じられているかどうかをrPar
。 パラメータはmaxNestingLevel
ネストのレベルを制御する。 最も一般的な用途は、デフォルトまたは0 である。後者の場合、 ネストは許可されない。Parameters:Range r
確認する範囲。 E lPar
左(開き)括弧に対応する要素。 E rPar
右(閉じ)括弧に対応する要素。 size_t maxNestingLevel
許容される最大ネストレベル。 Returns:truetrue指定された最大ネストレベル内で、指定された範囲内に釣り合った括弧がある場合は「true」、 そうでない場合は「false」を返す。Examples: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)(Rangeneedle
)
if (isRandomAccessRange!Range && hasSlicing!Range || isSomeString!Range); - find で使用するBoyer-Mooreマッチングを設定する。 デフォルトでは、要素は同一性について比較される。
BoyerMooreFinder
GCメモリを割り当てる。Parameters:pred 要素を比較するために使用される述語。 Range needle
長さとスライスによるランダムアクセス可能な範囲。 Returns:haystackhaystackそのインスタンスは、BoyerMooreFinder
find() と共に使用することで、 与えられた干し草の中から特定のものを検索するためのBoyer-Mooreマッチングアルゴリズムを呼び出すことができるneedle
与えられた干し草の山の中からExamples:auto bmFinder = boyerMooreFinder("TG"); string r = "TAGTGCCTGA"; // 干し草の山から最初の一致するものを探す r r = bmFinder.beFound(r); writeln(r); // "TGCCTGA" // 干し草の山で捜し物を続ける r = bmFinder.beFound(r[2 .. $]); writeln(r); // "TGA"
- this(Range
needle
); - scope Range
beFound
(Rangehaystack
); - @property size_t
length
(); - alias
opDollar
= length;
- auto
commonPrefix
(alias pred = "a == b", R1, R2)(R1r1
, R2r2
)
if (isForwardRange!R1 && isInputRange!R2 && !isNarrowString!R1 && is(typeof(binaryFun!pred(r1
.front,r2
.front))));
autocommonPrefix
(alias pred, R1, R2)(R1r1
, R2r2
)
if (isNarrowString!R1 && isInputRange!R2 && is(typeof(binaryFun!pred(r1
.front,r2
.front))));
autocommonPrefix
(R1, R2)(R1r1
, R2r2
)
if (isNarrowString!R1 && isInputRange!R2 && !isNarrowString!R2 && is(typeof(r1
.front ==r2
.front)));
autocommonPrefix
(R1, R2)(R1r1
, R2r2
)
if (isNarrowString!R1 && isNarrowString!R2); - 2つの範囲の共通部分を返す。Parameters: 共通部分を持つ要素を比較する際に使用する述語。デフォルトではReturns:number数スライスで、
r1
両方の範囲が一致する文字を含む。 最初の引数が文字列の場合、そうでなければ、takeExactly(r1
, n)、n は両方の範囲に共通する接頭辞の要素数である。See Also:result結果Examples:writeln(commonPrefix("hello, world", "hello, there")); // "hello, "
- size_t
count
(alias pred = "a == b", Range, E)(Rangehaystack
, Eneedle
)
if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(haystack
.front,needle
))));
size_tcount
(alias pred = "a == b", R1, R2)(R1haystack
, R2needle
)
if (isForwardRange!R1 && !isInfinite!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack
.front,needle
.front)))); - の一致数を数える。
needle
haystack
。最初のオーバーロードでは、e の各要素を注 オーバーロードに関係なく、haystack
pred(e,needle
)true である。pred はデフォルトで 等しい。Ο(haystack.length)で pred を評価する。 2番目のオーバーロードでは、needle
一致した回数を数えますhaystack
。pred は各範囲の要素を比較する。 の場合、例外がスローされる。needle
.emptytrue の場合、 任意のレンジにおける空のレンジのカウントは無限大となるため、例外が発生する。重複したカウントは 考慮されない。例えば、count
("aaa", "aa")1 であり、2 ではない。notない注釈 過負荷に関わらず、
count
無限の範囲は受け付けません。haystack
。Parameters:pred 要素を比較するための述語。 Range haystack
カウントする範囲。 E needle
要素またはサブレンジをカウントする haystack
。Returns:一致するものの数haystack
。Examples:match試合// 範囲内の要素を数える int[] a = [ 1, 2, 4, 3, 2, 5, 3, 2, 4 ]; writeln(count(a, 2)); // 3 writeln(count!("a > b")(a, 2)); // 5
Examples:すべての要素または述語を満たす要素をカウントするimport std.uni : toLower; // 範囲内のrangeを数える writeln(count("abcadfabf", "ab")); // 2 writeln(count("ababab", "abab")); // 1 writeln(count("ababab", "abx")); // 0 // あいまいな範囲内のrangeを数える writeln(count!((a, b) => toLower(a) == toLower(b))("AbcAdFaBf", "ab")); // 2
- size_t
count
(alias pred, R)(Rhaystack
)
if (isInputRange!R && !isInfinite!R && is(typeof(unaryFun!pred(haystack
.front))));
size_tcount
(R)(Rhaystack
)
if (isInputRange!R && !isInfinite!R); - すべての要素または述語を満たす要素を数える。
haystack
。最初のオーバーロードでは、e が であるhaystack
pred(e) true。pred のΟ (haystack.length)評価を行う。 2番目のオーバーロードでは、範囲内の要素数を数える。 指定された範囲がlength プロパティを持つ場合、 そのプロパティがすぐに返される。そうでない場合は、haystack.length )を実行して範囲を順にたどる。Parameters:pred 要素を見つけるためのオプションの述語。 R haystack
カウントする範囲。 Returns:truetruexml-ph-0000@deepl.internal が true を返したhaystack
(pred がtrueを返した)要素の数。Examples:与えられた前方範囲内の要素を カウントする。 与えられた述語が与えられた要素のいずれかに対して真になるまで// 範囲内の述語を数える int[] a = [ 1, 2, 4, 3, 2, 5, 3, 2, 4 ]; writeln(count(a)); // 9 // 範囲内の述語を数える writeln(count!("a > 2")(a)); // 5
- ptrdiff_t
countUntil
(alias pred = "a == b", R, Rs...)(Rhaystack
, Rsneedles
)
if (isForwardRange!R && (Rs.length > 0) && (isForwardRange!(Rs[0]) == isInputRange!(Rs[0])) && allSatisfy!(canTestStartsWith!(pred, R), Rs));
ptrdiff_tcountUntil
(alias pred = "a == b", R, N)(Rhaystack
, Nneedle
)
if (isInputRange!R && is(typeof(binaryFun!pred(haystack
.front,needle
)) : bool));
ptrdiff_tcountUntil
(alias pred, R)(Rhaystack
)
if (isInputRange!R && is(typeof(unaryFun!pred(haystack
.front)) : bool)); - 与えられた前方範囲内の要素を 数え、 与えられた述語が与えられた要素のいずれかに対して真になるまで
needles
。Parameters:Returns:先頭からポップされる要素の数haystack
その要素に到達するまでに startsWith!pred(haystack
,needles
)true である。 startsWith!pred(haystack
,needles
)のどの要素に対してもtrue でない場合、haystack
場合、-1 が返されます。pred のみが提供された場合、 pred(haystack
)各要素に対してテストされます。See Also:ininExamples:thenだ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
Examples:与えられた範囲が、与えられた針(複数可)で終わっているかどうかを確認する。 xml-ph-0000@deepl.internal の逆数。import std.ascii : isDigit; import std.uni : isWhite; writeln(countUntil!(isWhite)("hello world")); // 5 writeln(countUntil!(isDigit)("hello world")); // -1 writeln(countUntil!"a > 20"([0, 7, 12, 22, 9])); // 3
- uint
endsWith
(alias pred = "a == b", Range, Needles...)(RangedoesThisEnd
, NeedleswithOneOfThese
)
if (isBidirectionalRange!Range && (Needles.length > 1) && allSatisfy!(canTestStartsWith!(pred, Range), Needles));
boolendsWith
(alias pred = "a == b", R1, R2)(R1doesThisEnd
, R2withThis
)
if (isBidirectionalRange!R1 && isBidirectionalRange!R2 && is(typeof(binaryFun!pred(doesThisEnd
.back,withThis
.back)) : bool));
boolendsWith
(alias pred = "a == b", R, E)(RdoesThisEnd
, EwithThis
)
if (isBidirectionalRange!R && is(typeof(binaryFun!pred(doesThisEnd
.back,withThis
)) : bool));
boolendsWith
(alias pred, R)(RdoesThisEnd
)
if (isInputRange!R && ifTestable!(typeof(doesThisEnd
.front), unaryFun!pred)); - 与えられた範囲が、与えられた針(複数可)で終わっているかどうかを確認する。startsWith の逆数。Parameters:
pred 範囲と針(複数可)の要素を比較する際に使用する述語 。 Range doesThisEnd
双方向の範囲 を調べる。 Needles withOneOfThese
比較対象となる針。単一の要素、または双方向の要素範囲である可能性がある 。 R2 withThis
チェックする単一要素。 Returns: 針が指定された範囲の終わりにない場合は0、それ以外は一致する針の位置、つまり範囲が終わる場合は1xml-ph-0003@deepl.internalxml-ph-0003@deepl.internal針が指定された範囲の終わりに存在しない場合は0、 それ以外は一致する針の位置、つまり、範囲が で終わる場合は1、withOneOfThese
[0]、2であればwithOneOfThese
[1]、など。 ニードルパラメータが指定されていない場合、true を返す。ただし、doesThisStart が述語pred を満たす場合に限る。Examples: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, InputRange)(InputRangehaystack
)
if (isInputRange!InputRange); - 入力範囲の要素e を見つけ、pred(e) はtrue である。
find
他の言語におけるdropWhile と同様の動作をする。- 双方向の
テキストで 最後の一致する要素を見つけるには、
haystack
、 呼び出すfind
!pred(retro(haystack
))。 std.range.retro。
複雑さ
find
実行Ο(walkLength(haystack)) 評価pred.Parameters:pred 要素に一致する述語。 InputRange haystack
検索対象となる入力範囲 。 Returns: 先頭の要素がxml-ph-0000@deepl.internalを満たすように高度な検索を行う。そのような要素が存在しない場合は、空の要素を返す。advancedadvancedhaystack
先頭の要素がpred を満たすように高度な検索を行う。 そのような要素が存在しない場合は、空の値を返すhaystack
。Examples:advanced見つけるauto arr = [ 1, 2, 3, 4, 1 ]; writeln(find!("a > 2")(arr)); // [3, 4, 1] // 述語エイリアス付き bool pred(int e) => e + 1 > 1.5; writeln(find!(pred)(arr)); // arr
- InputRange
find
(alias pred = "a == b", InputRange, Element)(InputRangehaystack
, scope Elementneedle
)
if (isInputRange!InputRange && is(typeof(binaryFun!pred(haystack
.front,needle
)) : bool) && !is(typeof(binaryFun!pred(haystack
.front,needle
.front)) : bool));
R1find
(alias pred = "a == b", R1, R2)(R1haystack
, scope R2needle
)
if (isForwardRange!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack
.front,needle
.front)) : bool)); - 入力範囲内の個々の要素を見つける。 要素の
haystack
比較されます。needle
述語を使用して比較されます。pred pred(haystack
.front,needle
)。 この述語は std.functional.binaryFun、文字列を受け入れるか、pred(element, element) によって実行可能な任意のコールバックを受け入れる。haystack
順方向の範囲である場合、needle
範囲も可能です。 この場合、 startsWith!pred(haystack
,needle
)は各評価で評価されます。注釈: 針に一致しない最初の要素を見つけるには、述語"a != b" を使用する。Parameters:pred 各要素を針と比較するための述語。デフォルトでは等価である。"a == b" 。 InputRange haystack
検索対象となる入力範囲 。 Element needle
検索対象の要素。 Returns:haystack
前方の要素が検索対象となるように高度化されている。 つまり、xml-ph-0000@deepl.internal となるまで binaryFun!pred(haystack
.front,needle
)true となるまで。そのような位置が存在しない場合は、 空の文字列を返すhaystack
。See Also:to beだExamples: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!((e, n) => e > n)(4)); // [5, 6, 9] writeln(arr.find!((e, n) => e < n)(4)); // arr assert(arr.find(0).empty); assert(arr.find(10).empty); assert(arr.find(8).empty); writeln(find("hello, world", ',')); // ", world"
Examples: 大文字小文字を区別しない文字列検索case-insensitive大文字小文字を区別しない大文字小文字を区別しない文字列検索import std.range.primitives; import std.uni : toLower; string[] s = ["Hello", "world", "!"]; writeln(s.find!((e, n) => toLower(e) == n)("hello")); // s
findfindExamples:case-insensitive大文字小文字を区別しない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, Needles...)(Rangehaystack
, Needlesneedles
)
if (Needles.length > 1 && is(typeof(startsWith!pred(haystack
,needles
)))); - 2つ以上の
needles
。haystack
。述語pred は、要素を比較するために全体で使用される。デフォルトでは、要素は 等価であるかどうかが比較される。Parameters:pred 要素を比較する際に使用する述語。 Range haystack
検索の対象。入力範囲でなければならない。 いずれかが needles
比較可能な要素を含む範囲である場合、haystack
、haystack
前方範囲でなければなりません。 検索がバックトラックできるようにするためです。Needles needles
検索対象となる1つ以上の項目。それぞれは needles
、 の1つの要素と比較できるか、haystack
、またはそれ自体が 前方範囲であり、その前方範囲内の要素と比較可能な要素を持つhaystack
。Returns:to maximize最大化タプルは、haystack
いずれかの針に一致するように配置され、 またneedles 内の一致する要素の1を基底とするインデックス(一致するものがなければ0needles
一致しない場合は0、一致する場合は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
回数を できるだけ少なくする。Examples: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) // 比較可能な場合は、混合型も許可する writeln(find(a, 5, [1.2, 3.5], 2.0)); // tuple([2, 3], 3)
- RandomAccessRange
find
(RandomAccessRange, alias pred, InputRange)(RandomAccessRangehaystack
, scope BoyerMooreFinder!(pred, InputRange)needle
); - Parameters: 長さとスライスによるランダムアクセス範囲。
RandomAccessRange haystack
長さとスライスによるランダムアクセス範囲。 BoyerMooreFinder!(pred, InputRange) needle
BoyerMooreFinder。 Returns: 高度なもので、advancedadvancedhaystack
高度なもので、needle
その接頭辞である(そのような位置が存在しない場合は、haystack
終了するまで進む)。Examples:便利な関数。findと同様だが、検索が成功したかどうかのみを返す。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);
- template
canFind
(alias pred = "a == b") - 便利な関数。findと同様だが、検索が成功したかどうかのみを返す。pred の詳細については、 find。xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalSee Also:xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalstd.algorithm.comparison.among複数の引数に対して値をチェックする場合は、Examples:forだ
const arr = [0, 1, 2, 3]; assert(canFind(arr, 2)); assert(!canFind(arr, 4)); // いくつかの針のうちの1本を見つける assert(arr.canFind(3, 2)); assert(arr.canFind(3, 2) == 2); // 2本目の針が見つかった writeln(arr.canFind([1, 3], 2)); // 2 assert(canFind(arr, [1, 2], [2, 3])); writeln(canFind(arr, [1, 2], [2, 3])); // 1 assert(canFind(arr, [1, 7], [2, 3])); writeln(canFind(arr, [1, 7], [2, 3])); // 2 assert(!canFind(arr, [1, 3], [2, 4])); writeln(canFind(arr, [1, 3], [2, 4])); // 0
Examples: カスタム述語を使用した例。針は述語の2番目の引数として表示されることに注意。カスタム述語を使用した例。 針は述語の2番目の引数として表示されることに注意。auto words = [ "apple", "beeswax", "cardboard" ]; assert(!canFind(words, "bees")); assert( canFind!((string elem, string needle) => elem.startsWith(needle))(words, "bees"));
Examples:xml-ph-0001@deepl.internal が任意の値 xml-ph-0002@deepl.internal に対して真である場合にのみ、xml-ph-0000@deepl.internal を返す。アイテムの配列から複数のアイテムを検索する(干し草の山の中の針を探す)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")));
needle針- bool
canFind
(Range)(Rangehaystack
)
if (is(typeof(find!pred(haystack
)))); - 入力範囲range 内の値pred(e) が真である場合にのみ、true を返す。 e pred の評価を(多くとも)Ο(haystack.length)だけ行う。
- bool
canFind
(Range, Element)(Rangehaystack
, scope Elementneedle
)
if (is(typeof(find!pred(haystack
,needle
)))); - true が存在する場合にのみ、 を返す。
needle
range で見つかった場合のみ、 を返す。Ο(haystack.length) pred の評価を行う。 - size_t
canFind
(Range, Needles...)(Rangehaystack
, scope Needlesneedles
)
if (Needles.length > 1 && is(typeof(find!pred(haystack
,needles
)))); - 見つかった最初の針の1を基底とするインデックスを返す
haystack
。 もし 針が見つからなかった場合は、0 が返される。したがって、if 文やループの条件で直接使用した場合、 針の1つが見つかればtrue 、見つからなければfalse となる。 一方、結果を他の場所で使用する場合は、bool にキャストすることで同じ効果を得られるか、 find。 同じ操作を返す
- Range
findAdjacent
(alias pred = "a == b", Range)(Ranger
)
if (isForwardRange!Range); r
最初の2つの隣接要素a 、b を見つけるまで進む。pred(a, b) を満たす。Ο(r.length) の評価をpred に対して行う。pred の詳細については、 find。Parameters:pred 満たすべき述語。 Range r
検索する前方の範囲。 Returns: 与えられた述語を満たす隣接する2つの要素の最初の出現位置まで進む。そのような2つの要素がない場合は、戻り値はr
与えられた述語を満たす隣接する2つの要素の最初の出現位置まで進む。 そのような2つの要素がない場合は、r
空になるまで 前進する。See Also:STLSTLExamples:与えられた選択肢のいずれかと一致する要素を、与えられた範囲で検索する。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
(alias pred = "a == b", InputRange, ForwardRange)(InputRangeseq
, ForwardRangechoices
)
if (isInputRange!InputRange && isForwardRange!ForwardRange); - 与えられた選択肢のいずれかと一致する要素を、与えられた範囲内で検索する。
seq
呼び出しによってseq
.popFrontfind!(pred)(choices
,seq
.front)true になるか、seq
空になるまでpred をΟ(seq.length * choices.length) で評価する。 pred についての詳細は、 find。Returns:seq
最初の一致する要素まで、または一致する要素がない場合は空になるまで 進む。See Also:advancedExamples:int[] a = [ -1, 0, 1, 2, 3, 4, 5 ]; int[] b = [ 3, 1, 2 ]; writeln(findAmong(a, b)); // a[2 .. $]
- bool
findSkip
(alias pred = "a == b", R1, R2)(ref R1haystack
, R2needle
)
if (isForwardRange!R1 && isForwardRange!R2 && is(typeof(binaryFun!pred(haystack
.front,needle
.front))));
size_tfindSkip
(alias pred, R1)(ref R1haystack
)
if (isForwardRange!R1 && ifTestable!(typeof(haystack
.front), unaryFun!pred)); needle
haystack
、位置をhaystack
最初の出現の直後に位置を特定するneedle
。針が提供されていない場合、haystack
predがtrue と評価される限り、前進する。 同様に、pred がfalse と評価されるように、干し草の山の位置が決定される。haystack
.front。 pred についての詳細は、 find。Returns: 針が見つかった場合、その場合は、true 針が見つかった場合、その場合、haystack
最初の出現の後に配置されるneedle
。それ以外の場合、false はそのまま残し、haystack
。 針が提供されていない場合、 true を返した pred(haystack
.front)trueを返したSee Also:ofofExamples:otherwiseimport std.range.primitives : empty; // needleが見つかった; sはneedleの最初の出現位置に // 続く部分文字列に置き換えられる。 string s = "abcdef"; assert(findSkip(s, "cd") && s == "ef"); // needleは見つからない; sはそのまま残る。 s = "abcdef"; assert(!findSkip(s, "cxd") && s == "abcdef"); // 範囲の最後にneedleが現れた場合、その範囲は空欄のままとなる。 s = "abcdef"; assert(findSkip(s, "def") && s.empty);
Examples: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
(alias pred = "a == b", R1, R2)(R1haystack
, R2needle
)
if (isForwardRange!R1 && isForwardRange!R2);
autofindSplitBefore
(alias pred = "a == b", R1, R2)(R1haystack
, R2needle
)
if (isForwardRange!R1 && isForwardRange!R2);
autofindSplitAfter
(alias pred = "a == b", R1, R2)(R1haystack
, R2needle
)
if (isForwardRange!R1 && isForwardRange!R2); - これらの関数は、
needle
haystack
、 以下のように分割するhaystack
。xml-ph-0000@deepl.internalxml-ph-0001@deepl.internalfindSplit
3つの範囲を含むタプルresult を返す。- result[0] は
haystack
needle
- result[1] の部分に一致する
haystack
一致する部分needle
- result[2] 一致した部分の後の部分である。
haystack
一致した後の部分。
needle
見つからなかった場合、result[0] は完全に理解しhaystack
完全に理解し、result[1] とresult[2] は空になる。はfindSplitBefore
は、2つの範囲を含むタプルresult を返す。- result[0] は、その
haystack
needle
- result[1] 残りは
haystack
一致する部分から始まる。
needle
見つからなかった場合、result[0]は 完全に理解し、 は空になります。haystack
完全に理解し、result[1] は空になります。はfindSplitAfter
2つの範囲を含むタプルresult を返す。- result[0] の部分は、
haystack
マッチするものまでを含む 部分 - result[1] 残りは
haystack
一致 後の残額である。
needle
見つからなかった場合、result[0] は空欄、result[1] はhaystack
。いずれの場合も、返された範囲の結合は全体にまたがる。
もしhaystack
。haystack
ランダムアクセス可能な範囲である場合、タプルの3つのコンポーネントはすべて と同じ型であるhaystack
。 そうでなければ、haystack
前方範囲でなければならず、 result[0] (およびresult[1] )の型はfindSplit
結果と同じでなければならない。 std.range.takeExactly。 pred についての詳細は、 find。Parameters:pred 2つの要素を比較する述語。 R1 haystack
前方の範囲を検索する。 R2 needle
前方の範囲を検索する。 Returns:std.typecons.Tuple分割部分のサブタイプhaystack
(詳細は上記を参照)。このサブタイプのTuple はopCast!bool を定義し、 区切りが見つかった場合はtrue を返し、needle
見つかった場合は を返し、それ以外はfalse を返す。See Also:Examples: サブタイプを返すto return戻るサブタイプを返すことで、 std.typecons.Tupleすると、 次のような便利なイディオムが利用可能になる。// findSplitは3つの要素からなる組を返す if (auto split = "dlang-rocks".findSplit("-")) { writeln(split[0]); // "dlang" writeln(split[1]); // "-" writeln(split[2]); // "rocks" } else assert(0); // findSplitBeforeは2つの範囲を返す if (const split = [2, 3, 2, 3, 4, 1].findSplitBefore!"a > b"([2, 2])) { writeln(split[0]); // [2, 3, 2] // [3, 4]はそれぞれ[2, 2]より大きい writeln(split[1]); // [3, 4, 1] } else assert(0);
subtypeサブタイプExamples: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"( 記念ステーション) }
Examples: 使用するstd.range.only単一の要素を見つけるために使用する:import std.range : only; writeln([1, 2, 3, 4].findSplitBefore(only(3))[0]); // [1, 2]
to useだ - result[0] は
- Tuple!(ElementType!Range, size_t)
minCount
(alias pred = "a < b", Range)(Rangerange
)
if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range
.front,range
.front))));
Tuple!(ElementType!Range, size_t)maxCount
(alias pred = "a < b", Range)(Rangerange
)
if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range
.front,range
.front)))); - 最小値(最大値)を計算し、
range
その出現回数とともに。 厳密に言えば、最小値はx という値であり、range
pred(a, x) すべての値a においてfalse となるような値であるrange
。逆に、最大値はx という値であり、range
pred(x, a) は、aのすべての値に対してfalse である。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) の場合である。 "function""関数"Parameters:pred 極大値(最小値または最大値)を決定するために使用する順序述語。 Range range
カウントする入力範囲。 Returns:範囲の最小値、最大値の要素と、 その範囲における出現回数。limitation例制限事項 引数の少なくとも1つがNaNの場合、結果は 未定義の値となる。 std.algorithm.searching.maxElement NaN への対処方法の例については、
Throws:ififException 。range
.empty。 ifSee Also:,to beだExamples:渡された範囲を繰り返し、最小の要素を返す。 カスタムのマッピング関数は、xml-ph-0000@deepl.internal に渡すことができる。 他の言語では、これはxml-ph-000と呼ばれることもある。import std.conv : text; import std.typecons : tuple; int[] a = [ 2, 3, 4, 1, 2, 4, 1, 1, 2 ]; // 最小値は1で、3回発生する writeln(a.minCount); // tuple(1, 3) // 最大は4で、2回発生する writeln(a.maxCount); // tuple(4, 2)
- auto
minElement
(alias map = (a) => a, Range)(Ranger
)
if (isInputRange!Range && !isInfinite!Range);
autominElement
(alias map = (a) => a, Range, RangeElementType = ElementType!Range)(Ranger
, RangeElementTypeseed
)
if (isInputRange!Range && !isInfinite!Range && !is(CommonType!(ElementType!Range, RangeElementType) == void)); - 渡された範囲を反復し、最小の要素を返す。 カスタムのマッピング関数は、map に渡すことができる。 他の言語では、これはargmin と呼ばれることもある。
複雑さ O(n) n - 1 比較が正確に必要である。
Parameters:map 比較キー用のカスタムアクセッサ Range r
最小の要素が選択される範囲 RangeElementType seed
初期要素として使用するカスタムシード 前提条件 シードが指定されない場合は、
r
空であってはならない。Returns:注意 引数のうち少なくともひとつが NaN の場合、結果は未定義の値となる。 xml-ph-0000@deepl.internal NaN を無視したい場合は、渡された範囲の最小要素。注釈 引数のうち少なくともひとつが NaN の場合、結果は未定義の値となる。
NaN を無視したい場合は、 std.algorithm.iteration.filter std.math.isNaNminElementを適用する前に、それらを削除する。 すべての要素が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);
xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalSee Also:to beだExamples:to beだimport std.range : enumerate; import std.typecons : tuple; writeln([2, 7, 1, 3].minElement); // 1 // 要素のインデックスも取得できる writeln([5, 3, 7, 9].enumerate.minElement!"a.value"); // tuple(1, 3) // 任意のカスタムアクセサリを渡すことができる writeln([[0, 4], [1, 2]].minElement!"a[1]"); // [1, 2] // シードできる int[] arr; writeln(arr.minElement(1)); // 1
- auto
maxElement
(alias map = (a) => a, Range)(Ranger
)
if (isInputRange!Range && !isInfinite!Range);
automaxElement
(alias map = (a) => a, Range, RangeElementType = ElementType!Range)(Ranger
, RangeElementTypeseed
)
if (isInputRange!Range && !isInfinite!Range && !is(CommonType!(ElementType!Range, RangeElementType) == void)); - 渡された範囲を繰り返し、最大の要素を返す。 カスタムのマッピング関数は、map に渡すことができる。 他の言語では、これはargmax と呼ばれることもある。
複雑さ O(n) n - 1 比較が正確に必要である。
Parameters:map 比較キー用のカスタムアクセッサ Range r
最大要素が選択される範囲 RangeElementType seed
初期要素として使用するカスタムシード 前提条件 シードが指定されない場合は、
r
空であってはならない。Returns:注意 引数のうち少なくともひとつが NaN の場合、結果は未定義の値となる。 参照渡された範囲の最大要素。注釈 引数のうち少なくともひとつが NaN の場合、結果は未定義の値となる。 std.algorithm.searching.minElementNaN への対処方法の例については、 こちらを参照のこと。
See Also:to beだExamples:import std.range : enumerate; import std.typecons : tuple; writeln([2, 1, 4, 3].maxElement); // 4 // 要素のインデックスも取得できる writeln([2, 1, 4, 3].enumerate.maxElement!"a.value"); // tuple(2, 4) // 任意のカスタムアクセサリを渡すことができる writeln([[0, 4], [1, 2]].maxElement!"a[1]"); // [0, 4] // シードできる int[] arr; writeln(arr.minElement(1)); // 1
- Range
minPos
(alias pred = "a < b", Range)(Rangerange
)
if (isForwardRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range
.front,range
.front))));
RangemaxPos
(alias pred = "a < b", Range)(Rangerange
)
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) は、a のすべての値に対してfalse となるような値であるrange
(pred への引数の交換に注意)。 これらの関数は、predを適切に選択することで、任意の極値を計算するために使用できる。 正しく機能させるには、pred は厳密な半順序でなければならない。 すなわち、推移的(pred(a, b) && pred(b, c) ならpred(a, c) )で 反射的ではない(pred(a, a) はfalse )。 "function""関数"Parameters:pred 極大(最小または最大)要素を決定するために使用する順序述語。 Range range
検索する範囲。 Returns: 前方範囲の最小(最大)要素の位置制限事項 引数のうち少なくとも1つがNaNの場合、結果は 未定義の値となる。 参照前方範囲の最小(最大)要素の位置range
、すなわち、range
最小(それぞれ最大)要素の位置から始まり、 同じ終了位置を持つrange
。to beだ制限事項 引数のうち少なくとも1つがNaNの場合、結果は 未定義の値となる。 std.algorithm.searching.maxElement NaN への対処方法の例については、
Examples:最初の出現のインデックスを計算する。int[] a = [ 2, 3, 4, 1, 2, 4, 1, 1, 2 ]; // 最小値は1で、位置3に最初に現れる writeln(a.minPos); // [1, 2, 4, 1, 1, 2] // 最大は4で、最初に位置2で発生する writeln(a.maxPos); // [4, 1, 2, 4, 1, 1, 2]
- ptrdiff_t
minIndex
(alias pred = "a < b", Range)(Rangerange
)
if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range
.front,range
.front)))); - の最小要素の最初の出現のインデックスを計算する
range
最小要素の最初の出現のインデックスを計算する。Parameters:pred 最小要素を決定するために使用する順序付け述語。 Range range
検索対象となる入力範囲。 複雑性 Ο(range.length) 正確な
range
.length - 1比較が必要である。Returns:最小要素の最初の遭遇のインデックスrange
。range
空の場合は、-1 が返されます。制限事項 引数の少なくとも1つがNaNの場合、結果は 未定義の値となる。 std.algorithm.searching.maxElement NaN への対処方法の例については、
See Also:to beだExamples:最初の出現のインデックスを計算する。int[] a = [2, 3, 4, 1, 2, 4, 1, 1, 2]; // 最小値は1で、位置3に最初に現れる writeln(a.minIndex); // 3 // minIndexで最大インデックスを得る writeln(a.minIndex!"a > b"); // 2 // 範囲が空なので、戻り値は-1 int[] b; writeln(b.minIndex); // -1 // より多くのカスタムタイプで動作する 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)(Rangerange
)
if (isInputRange!Range && !isInfinite!Range && is(typeof(binaryFun!pred(range
.front,range
.front)))); - の最大要素の最初の出現のインデックスを計算する
range
最大要素の最初の出現のインデックスを計算する。計算量 Ο(range) 正確な
range
.length - 1比較が必要である。Parameters:pred 最大要素を決定するために使用する順序述語。 Range range
検索する入力範囲。 Returns: 最大値が最初に現れたインデックス最大値が最初に現れたインデックス。range
。range
空の場合は、-1が返されます。制限事項 引数のうち少なくとも1つがNaNの場合、結果は 未定義の値となる。 std.algorithm.searching.maxElement NaN への対処方法の例については、
See Also:to beだExamples:xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal// 最大は4で、最初に位置2で発生する int[] a = [2, 3, 4, 1, 2, 4, 1, 1, 2]; writeln(a.maxIndex); // 2 // 空の範囲 int[] b; writeln(b.maxIndex); // -1 // より多くのカスタムタイプで動作する 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) のいずれかと完全に一致する部分をスキップする。または、 2番目の範囲が与えられていない場合は、predを満たす要素をスキップする。 一致しない場合は何もしない。Parameters:xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal
pred それぞれの範囲の要素が一致するかどうかを判定する述語。 デフォルトは等価"a == b" 。 Examples:xml-ph-0000@deepl.internalxml-ph-0000@deepl.internalimport 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"]
Examples: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);
Examples:skipoverskipOver可変長スキップauto s = "Hello world"; assert(!skipOver(s, "hello", "HellO")); writeln(s); // "Hello world" // 範囲はスキップされ、最も長い一致するneedleはスキップされる assert(skipOver(s, "foo", "hell", "Hello ")); writeln(s); // "world"
skipoverskipOverExamples:skipoverskipOverimport 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'));
Examples: 部分的なインスタンス化partial instantiation部分的なインスタンス化部分的なインスタンス化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);
partial instantiation部分的なインスタンス化- bool
skipOver
(Haystack, Needles...)(ref Haystackhaystack
, Needlesneedles
)
if (is(typeof(binaryFun!pred(haystack
.front,needles
[0].front))) && isForwardRange!Haystack && allSatisfy!(isInputRange, Needles) && !is(CommonType!(staticMap!(ElementType, staticMap!(Unqual, Needles))) == void));
boolskipOver
(R)(ref Rr1
)
if (isForwardRange!R && ifTestable!(typeof(r1
.front), unaryFun!pred));
boolskipOver
(R, Es...)(ref Rr
, Eses
)
if (isInputRange!R && is(typeof(binaryFun!pred(r
.front,es
[0])))); - Parameters: 前方に移動できる範囲 。Returns:true 接頭辞が
haystack
いずれかの範囲に一致するneedles
完全に 一致するか、pred が true と評価され、haystack
このセグメントを過ぎた位置まで進められ、 そうでなければ false となり、haystack
元の位置に残る。注釈 定義上、空の範囲は完全に一致し、
needles
空の範囲が含まれている場合、skipOver
true が返されます。
- uint
startsWith
(alias pred = (a, b) => a == b, Range, Needles...)(RangedoesThisStart
, NeedleswithOneOfThese
)
if (isInputRange!Range && (Needles.length > 1) && allSatisfy!(canTestStartsWith!(pred, Range), Needles));
boolstartsWith
(alias pred = "a == b", R1, R2)(R1doesThisStart
, R2withThis
)
if (isInputRange!R1 && isInputRange!R2 && is(typeof(binaryFun!pred(doesThisStart
.front,withThis
.front)) : bool));
boolstartsWith
(alias pred = "a == b", R, E)(RdoesThisStart
, EwithThis
)
if (isInputRange!R && is(typeof(binaryFun!pred(doesThisStart
.front,withThis
)) : bool));
boolstartsWith
(alias pred, R)(RdoesThisStart
)
if (isInputRange!R && ifTestable!(typeof(doesThisStart
.front), unaryFun!pred)); - 与えられた入力範囲が、 与えられた針(複数可)で始まるかどうか、 または、針が与えられていない場合は、 その先頭の要素が述語を満たすかどうかを調べる。pred 。pred に関する詳細情報については、 find。Parameters: haystack(干し草の山)と針(複数形)の要素を比較する際に使用する述語。針が指定されていない場合は必須。
pred 干し草の山と針(複数可)の要素を比較する際に使用する述語。 針が指定されていない場合は必須。 Range doesThisStart
確認する入力範囲。 Needles withOneOfThese
範囲を照合する針、 すなわち個々の要素または要素の入力範囲である。 R2 withThis
チェックする単一の針。これは、単一の要素または 要素の入力範囲のいずれかである。 Returns:xml-ph-0000@deepl.internalxml-ph-0000@deepl.internal指定された範囲の最初で針(複数可)が発生していない場合は0、 それ以外は一致する針の位置、つまり、範囲が で始まっている場合は1、withOneOfThese
[0]、2 はwithOneOfThese
[1]、 というように 続きます。doesThisStart
複数の範囲または要素で始まる場合、withOneOfThese
、最も短いものが一致します( 一致するものが2つあり、同じ長さである場合(例:"a" と'a' )、 引数リストの最も左にあるものが一致します )。 針パラメータが与えられていない場合、true を返します。doesThisStart
述語pred を満たす場合、 を返す。Examples: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)(Rangerange
, Sentinelsentinel
, OpenRightopenRight
= Yes.openRight
)
if (!is(Sentinel == OpenRight));
Until!(pred, Range, void)until
(alias pred, Range)(Rangerange
, OpenRightopenRight
= Yes.openRight
);
structUntil
(alias pred, Range, Sentinel) if (isInputRange!Range); - 遅延して反復し、
range
要素がe になるまでpred(e,sentinel
)trueこれは、他の言語におけるtakeWhile と同様である。Parameters:higher高いpred 停止するタイミングを決定する述語。 Range range
反復処理の対象となる入力範囲。 Sentinel sentinel
停止する要素。 OpenRight openRight
指定された述語が真である要素が 結果のレンジに含まれるべきか(No. openRight
、または そうでない(Yes.openRight
。Examples:rangerangeimport 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]));
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.109.1
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku