英語版
このページの英語版を見る
std.array
組み込み配列や連想配列を操作する関数や型。
このモジュールは、配列を作成、操作、変換するあらゆる種類の関数を提供する:
関数名 | 説明 |
---|---|
array | 新しく割り当てられた動的配列に入力のコピーを返す。 |
appender | 新しい Appenderまたは RefAppenderを返す。 |
assocArray | key/value タプルの範囲から、新しく確保した連想配列を返す。 |
byPair | key/valueタプルで連想配列を反復処理する範囲を構築する。 |
insertInPlace | 指定された位置の既存の配列に挿入する。 |
join | 範囲を1つの配列に連結する。 |
minimallyInitializedArray | T 型の新しい配列を返す。 |
replace | ある部分範囲の出現回数をすべて置換した新しい配列を返す。 |
replaceFirst | ある部分範囲の最初の出現回数を置換した新しい配列を返す。 |
replaceInPlace | ある部分範囲のすべての出現回数を置換し、その結果を指定した配列に入れる。 |
replaceInto | ある部分範囲のすべての出現回数を置換し、結果を出力範囲に入れる。 |
replaceLast | ある部分範囲の最後の出現回数を置換した新しい配列を返す。 |
replaceSlice | 指定したスライスを置換した新しい配列を返す。 |
replicate | 入力配列または範囲の複数のコピーから新しい配列を作成する。 |
sameHead | 2つの配列の初期セグメントが、メモリ上の同じ場所を参照しているかどうかを調べる。 を参照しているかどうかを調べる。 |
sameTail | 2つの配列の最後のセグメントが、メモリ上の同じ場所を参照しているかどうかを調べる。 を参照するかどうかを調べる。 |
split | 範囲や文字列を配列に分割する。 |
staticArray | 与えられたデータから新しい静的配列を作成する。 |
uninitializedArray | 要素を初期化せずに、T 型の新しい配列を返す。 |
License:
Authors:
ソース std/array.d
- ForeachType!Range[]
array
(Range)(Ranger
)
if (isIterable!Range && !isAutodecodableString!Range && !isInfinite!Range);
ForeachType!(typeof((*Range).init))[]array
(Range)(Ranger
)
if (is(Range == U*, U) && isIterable!U && !isAutodecodableString!Range && !isInfinite!Range); - 配列を確保し、要素のコピーで初期化する。 の要素のコピーで初期化する。
r
.狭い文字列は以下のように扱われる:- オートデコードがオンになっている場合(デフォルト)、別のオーバーロードとして扱われる。
- オートデコードがオフの場合、これは配列を複製することと同じである。
Parameters:Range r
opApply その要素が確保された配列にコピーされる。 Returns:確保され、初期化された配列Examples:auto a = array([1, 2, 3, 4, 5][]); writeln(a); // [1, 2, 3, 4, 5]
- CopyTypeQualifiers!(ElementType!String, dchar)[]
array
(String)(scope Stringstr
)
if (isAutodecodableString!String); - 狭いオートデコード文字列を、ランダムアクセスを完全にサポートする配列型に変換する。 型に変換する。 これは特殊なケースとして扱われ、常に配列 を返す。dchar
の配列を返す。 この関数は、オートデコードがオフになっている場合には使用されない。
Parameters:String str
isNarrowString の配列に変換される。dchar Returns:dchar[] const(dchar)[] immutable(dchar)[] の配列に変換される。 の配列に変換される。Examples:import std.range.primitives : isRandomAccessRange; import std.traits : isAutodecodableString; // 自動デコードがオフの場合、`array`はこれらをトランスコードしないことに注意。 static if (isAutodecodableString!string) writeln("Hello D".array); // "Hello D"d else writeln("Hello D".array); // "Hello D" static if (isAutodecodableString!wstring) writeln("Hello D"w.array); // "Hello D"d else writeln("Hello D"w.array); // "Hello D"w static assert(isRandomAccessRange!dstring == true);
- auto
assocArray
(Range)(Ranger
)
if (isInputRange!Range);
autoassocArray
(Keys, Values)(Keyskeys
, Valuesvalues
)
if (isInputRange!Values && isInputRange!Keys); - キーと値のタプルの範囲から、あるいはキーと値の範囲から、新しく割り当てられた連想配列を返す。 またはキーと値の範囲から新しく確保された連想配列を返す。Returns:入力範囲の要素から新しく割り当てられた連想配列。 タプルの範囲(キー、値)またはキーと値の範囲でなければならない。 キーと値の範囲でなければならない。長さが等しくない2つの範囲が与えられた場合 が与えられた場合、短い方の範囲の要素を使い果たした後は、長い方の残りの要素は考慮されない。 の要素は考慮されない。 空の範囲が指定された場合は、NULL連想配列参照を返す。
重複 連想配列は一意なキーを持つ。rに重複したキーが含まれている場合、結果はr内のそのキーの最後のペアの値を含む、 が重複している場合、結果にはr内のキーの最後のペアの値が含まれる。
See Also:Examples:import std.range : repeat, zip; import std.typecons : tuple; import std.range.primitives : autodecodeStrings; auto a = assocArray(zip([0, 1, 2], ["a", "b", "c"])); // 別名 zipMap static assert(is(typeof(a) == string[int])); writeln(a); // [0:"a", 1:"b", 2:"c"] auto b = assocArray([ tuple("foo", "bar"), tuple("baz", "quux") ]); static assert(is(typeof(b) == string[string])); writeln(b); // ["foo":"bar", "baz":"quux"] static if (autodecodeStrings) alias achar = dchar; else alias achar = immutable(char); auto c = assocArray("ABCD", true.repeat); static assert(is(typeof(c) == bool[achar])); bool[achar] expected = ['D':true, 'A':true, 'B':true, 'C':true]; writeln(c); // expected
- auto
byPair
(AA)(AAaa
)
if (isAssociativeArray!AA); - 連想配列をキー/値タプルで反復する範囲を構築する。Parameters:
AA aa
反復処理する連想配列。 Returns:Examples:import std.algorithm.sorting : sort; import std.typecons : tuple, Tuple; auto aa = ["a": 1, "b": 2, "c": 3]; Tuple!(string, int)[] pairs; // キーと値のペアの反復処理。 foreach (pair; aa.byPair) { if (pair.key == "b") pairs ~= tuple("B", pair.value); else pairs ~= pair; } // 反復の順序は実装に依存するので、固定順序になるように // ソートする必要がある。 pairs.sort(); assert(pairs == [ tuple("B", 2), tuple("a", 1), tuple("c", 3) ]);
- nothrow @system auto
uninitializedArray
(T, I...)(Isizes
)
if (isDynamicArray!T && allSatisfy!(isIntegral, I) && hasIndirections!(ElementEncodingType!T));
nothrow @trusted autouninitializedArray
(T, I...)(Isizes
)
if (isDynamicArray!T && allSatisfy!(isIntegral, I) && !hasIndirections!(ElementEncodingType!T)); - ガベージコレクションされたヒープ上に確保されたT 型の新しい配列を返す。 型の新しい配列を返す。すべての 要素が即座に初期化される場合、これは有用な最適化である。T は多次元配列であってもよい。 配列かもしれない。この場合、サイズは0から の数までの任意の次元数を指定することができる。 からT の数までの任意の次元数を指定することができる。uninitializedArrayはnothrow 、弱くpure 。 uninitializedArrayは、初期化されていない要素型がポインタを持つ場合、@system 。Parameters:
T 結果として得られる配列要素の型。 I sizes
結果の配列の長さ寸法。 Returns:I.length 次元のT の配列。Examples:double[] arr = uninitializedArray!(double[])(100); writeln(arr.length); // 100 double[][] matrix = uninitializedArray!(double[][])(42, 31); writeln(matrix.length); // 42 writeln(matrix[0].length); // 31 char*[] ptrs = uninitializedArray!(char*[])(100); writeln(ptrs.length); // 100
- nothrow @trusted auto
minimallyInitializedArray
(T, I...)(Isizes
)
if (isDynamicArray!T && allSatisfy!(isIntegral, I)); - ガベージコレクションされたヒープ上に確保されたT 型の新しい配列を返す。部分的な初期化は、メモリ安全性を保つために、間接関数を持つ型に対して行われる。 メモリ安全性を保つためである。要素は0に初期化されるだけで、要素の型の初期化が行われるとは限らない。 必ずしも要素型の.init 。 minimallyInitializedArrayはnothrow 、弱くpure 。Parameters:
T 配列要素の型。 I sizes
結果として得られる配列の長さ寸法。 Returns:I.length 次元のT の配列。Examples:import std.algorithm.comparison : equal; import std.range : repeat; auto arr = minimallyInitializedArray!(int[])(42); writeln(arr.length); // 42 // 要素は必ずしも0に初期化されるとは限らないので、これはしないこと: // assert(arr.equal(0.repeat(42))); // 必要であれば、代わりに通常通り配列を初期化する: auto arr2 = new int[42]; assert(arr2.equal(0.repeat(42)));
- @trusted CommonType!(T[], U[])
overlap
(T, U)(T[]a
, U[]b
)
if (is(typeof(a
.ptr <b
.ptr) == bool)); - 2つの配列の重なり部分があればそれを返す。equal とは異なる、
overlap
とは異なり のポインタと長さを比較するだけであり、それらが参照する値を比較するわけではない。r1 とr2 に重複するスライスがあれば、そのスライスを返す。 スライスが重なっていれば、そのスライスを返す。そうでなければ、NULLの スライスを返す。Parameters:T[] a
比較する最初の配列 U[] b
比較する2番目の配列 Returns:2つの配列の重なり部分。Examples:int[] a = [ 10, 11, 12, 13, 14 ]; int[] b = a[1 .. 3]; writeln(overlap(a, b)); // [11, 12] b = b.dup; // 内容が同じでも重なりが消える assert(overlap(a, b).empty); static test()() @nogc { auto a = "It's three o'clock"d; auto b = a[5 .. 10]; return b.overlap(a); } // コンパイル時に動作する static assert(test == "three"d);
- void
insertInPlace
(T, U...)(ref T[]array
, size_tpos
, Ustuff
)
if (!isSomeString!(T[]) && allSatisfy!(isInputRangeOrConvertible!T, U) && (U.length > 0));
voidinsertInPlace
(T, U...)(ref T[]array
, size_tpos
, Ustuff
)
if (isSomeString!(T[]) && allSatisfy!(isCharOrStringOrDcharRange, U)); - 挿入
stuff
(を挿入する。 を挿入する。array
を挿入する。pos
.Parameters:T[] array
に挿入される stuff
に挿入される。size_t pos
挿入する array
を挿入する。stuff
.U stuff
入力範囲、 に挿入する暗黙的に変換可能な項目の数。 array
.Examples:int[] a = [ 1, 2, 3, 4 ]; a.insertInPlace(2, [ 1, 2 ]); writeln(a); // [1, 2, 1, 2, 3, 4] a.insertInPlace(3, 10u, 11); writeln(a); // [1, 2, 1, 10, 11, 2, 3, 4] union U { float a = 3.0; int b; } U u1 = { b : 3 }; U u2 = { b : 4 }; U u3 = { b : 5 }; U[] unionArr = [u2, u3]; unionArr.insertInPlace(2, [u1]); writeln(unionArr); // [u2, u3, u1] unionArr.insertInPlace(0, [u3, u2]); writeln(unionArr); // [u3, u2, u2, u3, u1] static class C { int a; float b; this(int a, float b) { this.a = a; this.b = b; } } C c1 = new C(42, 1.0); C c2 = new C(0, 0.0); C c3 = new C(int.max, float.init); C[] classArr = [c1, c2, c3]; insertInPlace(classArr, 3, [c2, c3]); C[5] classArr1 = classArr; writeln(classArr1); // [c1, c2, c3, c2, c3] insertInPlace(classArr, 0, c3, c1); C[7] classArr2 = classArr; writeln(classArr2); // [c3, c1, c1, c2, c3, c2, c3]
- pure nothrow @nogc @safe bool
sameHead
(T)(in T[]lhs
, in T[]rhs
); - のfrontsかどうかを返す。
lhs
とrhs
の両方がメモリ上の の両方がメモリ上の同じ場所を参照しているかどうかを返す。 0 のスライスである。Parameters:T[] lhs
比較する最初の配列 T[] rhs
比較する2番目の配列 Returns:true もし 、そうでなければ 。lhs.ptr == rhs.ptr falseExamples:auto a = [1, 2, 3, 4, 5]; auto b = a[0 .. 2]; assert(a.sameHead(b));
- pure nothrow @nogc @trusted bool
sameTail
(T)(in T[]lhs
, in T[]rhs
); - のbacksかどうかを返す。
lhs
とrhs
の両方がメモリ上の の両方がメモリ上の同じ場所を参照しているかどうかを返す。 $ のスライスである。Parameters:T[] lhs
比較する最初の配列 T[] rhs
比較する2番目の配列 Returns:true 両配列が同じ長さの場合、 、 そうでない場合はlhs.ptr == rhs.ptr falseExamples:auto a = [1, 2, 3, 4, 5]; auto b = a[3..$]; assert(a.sameTail(b));
- ElementEncodingType!S[]
replicate
(S)(Ss
, size_tn
)
if (isDynamicArray!S);
ElementType!S[]replicate
(S)(Ss
, size_tn
)
if (isInputRange!S && !isDynamicArray!S); - Parameters:
S s
入力範囲 または動的配列 size_t n
繰り返し回数 s
Returns:で構成される配列。s
繰り返しn
回繰り返される。この関数は新しい配列を確保し、満たし、返す。 を返す。See Also:手抜きバージョンについては、以下を参照のこと。 std.range.repeat.Examples:auto a = "abc"; auto s = replicate(a, 3); writeln(s); // "abcabcabc" auto b = [1, 2, 3]; auto c = replicate(b, 3); writeln(c); // [1, 2, 3, 1, 2, 3, 1, 2, 3] auto d = replicate(b, 0); writeln(d); // []
- pure @safe S[]
split
(S)(Ss
)
if (isSomeString!S);
autosplit
(Range, Separator)(Rangerange
, Separatorsep
)
if (isForwardRange!Range && (is(typeof(ElementType!Range.init == Separator.init)) || is(typeof(ElementType!Range.init == ElementType!Separator.init)) && isForwardRange!Separator));
autosplit
(alias isTerminator, Range)(Rangerange
)
if (isForwardRange!Range && is(typeof(unaryFun!isTerminator(range
.front)))); - を配列に分割する。
range
を配列に分割する。sep
を区切り文字として使用する。区切り文字を指定しない場合は、文字列は単語の配列に分割される、 に分割される。 空白を含む文字列はマージされる(空の単語は生成されない)。 区切り文字はrange
は前方範囲でなければならない。 の要素と同じ型の値である。range
の要素と同じ型の値であってもよいし、別の前方range
.Parameters:S s
区切り文字が指定されない場合は、単語で分割する文字列 Range range
分割する範囲 Separator sep
の要素と同じ型の値。 range
または別のisTerminator true を返した場合に、その範囲を分割する述語。 Returns:の分割された部分を含む配列。range
(またはs
).See Also:std.algorithm.iteration.splitterを使えば、メモリを割り当てずに遅延バージョンを作ることができる。 std.regex.splitter正規表現で定義された 式で定義されたセパレータを使って分割する。Examples:import std.uni : isWhite; writeln("Learning,D,is,fun".split(",")); // ["Learning", "D", "is", "fun"] writeln("Learning D is fun".split!isWhite); // ["Learning", "D", "is", "fun"] writeln("Learning D is fun".split(" D ")); // ["Learning", "is fun"]
Examples:string str = "Hello World!"; writeln(str.split); // ["Hello", "World!"] string str2 = "Hello\t\tWorld\t!"; writeln(str2.split); // ["Hello", "World", "!"]
Examples:writeln(split("hello world")); // ["hello", "world"] writeln(split("192.168.0.1", ".")); // ["192", "168", "0", "1"] auto a = split([1, 2, 3, 4, 5, 1, 2, 3, 4, 5], [2, 3]); writeln(a); // [[1], [4, 5, 1], [4, 5]]
- ElementEncodingType!(ElementType!RoR)[]
join
(RoR, R)(RoRror
, Rsep
)
if (isInputRange!RoR && isInputRange!(Unqual!(ElementType!RoR)) && isInputRange!R && (is(immutable(ElementType!(ElementType!RoR)) == immutable(ElementType!R)) || isSomeChar!(ElementType!(ElementType!RoR)) && isSomeChar!(ElementType!R)));
ElementEncodingType!(ElementType!RoR)[]join
(RoR, E)(RoRror
, scope Esep
)
if (isInputRange!RoR && isInputRange!(Unqual!(ElementType!RoR)) && (is(E : ElementType!(ElementType!RoR)) || !autodecodeStrings && isSomeChar!(ElementType!(ElementType!RoR)) && isSomeChar!E));
ElementEncodingType!(ElementType!RoR)[]join
(RoR)(RoRror
)
if (isInputRange!RoR && isInputRange!(Unqual!(ElementType!RoR))); - のすべての範囲を(GCと一緒に)熱心に連結する。
ror
を1つの配列に連結する。 を使って1つの配列に連結する。sep
をセパレーターとして使用する。Parameters:RoR ror
入力範囲 入力範囲の R sep
入力範囲、または単一の要素。 Returns:要素の配列See Also:手抜きバージョンについては、以下を参照のこと。 std.algorithm.iteration.joinerExamples:writeln(join(["hello", "silly", "world"], " ")); // "hello silly world" writeln(join(["hello", "silly", "world"])); // "hellosillyworld" writeln(join([[1, 2, 3], [4, 5]], [72, 73])); // [1, 2, 3, 72, 73, 4, 5] writeln(join([[1, 2, 3], [4, 5]])); // [1, 2, 3, 4, 5] const string[] arr = ["apple", "banana"]; writeln(arr.join(",")); // "apple,banana" writeln(arr.join()); // "applebanana"
- E[]
replace
(E, R1, R2)(E[]subject
, R1from
, R2to
)
if (isForwardRange!R1 && isForwardRange!R2 && (hasLength!R2 || isSomeString!R2) || is(Unqual!E : Unqual!R1)); - の出現箇所を置き換える。
from
をto
を置き換える。subject
を新しい配列に置き換える。Parameters:E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
のすべてのインスタンスを置き換える from
で置き換える。Returns:の中身を変えずに新しい配列に置き換える。subject
の内容を変更しない新しい配列。 の中身を変えずに新しい配列を返す。See Also:std.algorithm.iteration.substitute手抜きのリプレースだ。Examples:writeln("Hello Wörld".replace("o Wö", "o Wo")); // "Hello World" writeln("Hello Wörld".replace("l", "h")); // "Hehho Wörhd"
- E[]
replace
(E, R1, R2)(E[]subject
, R1from
, R2to
, ref size_tchanged
)
if (isForwardRange!R1 && isForwardRange!R2 && (hasLength!R2 || isSomeString!R2) || is(Unqual!E : Unqual!R1)); - の出現箇所を置き換える。
from
をto
を置き換える。subject
を新しい配列に置き換える。changed
置換が何回行われたかをカウントする。Parameters:E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
のすべてのインスタンスを置き換える from
で置き換える。size_t changed
置換の数 Returns:の中身を変えずに新しい配列を作る。subject
の内容を変更しない新しい配列、あるいは の中身を変えずに新しい配列を返す。Examples:size_t changed = 0; writeln("Hello Wörld".replace("o Wö", "o Wo", changed)); // "Hello World" writeln(changed); // 1 changed = 0; writeln("Hello Wörld".replace("l", "h", changed)); // "Hehho Wörhd" import std.stdio : writeln; writeln(changed); writeln(changed); // 3
- void
replaceInto
(E, Sink, R1, R2)(Sinksink
, E[]subject
, R1from
, R2to
)
if (isOutputRange!(Sink, E) && (isForwardRange!R1 && isForwardRange!R2 && (hasLength!R2 || isSomeString!R2) || is(Unqual!E : Unqual!R1))); - の出現箇所を置き換える。
from
をto
で置換する。subject
に置換し、その結果をsink
.Parameters:Sink sink
出力範囲 E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
のすべてのインスタンスを置き換える from
をSee Also:Examples:auto arr = [1, 2, 3, 4, 5]; auto from = [2, 3]; auto to = [4, 6]; auto sink = appender!(int[])(); replaceInto(sink, arr, from, to); writeln(sink.data); // [1, 4, 6, 4, 5]
- void
replaceInto
(E, Sink, R1, R2)(Sinksink
, E[]subject
, R1from
, R2to
, ref size_tchanged
)
if (isOutputRange!(Sink, E) && (isForwardRange!R1 && isForwardRange!R2 && (hasLength!R2 || isSomeString!R2) || is(Unqual!E : Unqual!R1))); - の出現箇所を置き換える。
from
をto
で置換する。subject
に置換し、その結果をsink
.changed
に出力する。Parameters:Sink sink
出力範囲 E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
のすべてのインスタンスを置き換える from
を含むsize_t changed
置換の数 Examples:auto arr = [1, 2, 3, 4, 5]; auto from = [2, 3]; auto to = [4, 6]; auto sink = appender!(int[])(); size_t changed = 0; replaceInto(sink, arr, from, to, changed); writeln(sink.data); // [1, 4, 6, 4, 5] writeln(changed); // 1
- T[]
replace
(T, Range)(T[]subject
, size_tfrom
, size_tto
, Rangestuff
)
if (isInputRange!Range && (is(ElementType!Range : T) || isSomeString!(T[]) && is(ElementType!Range : dchar))); - array の要素を以下の範囲のインデックスで置き換える。
from
からto
(排他的)の範囲の要素をstuff
.Parameters:T[] subject
スキャンする配列 size_t from
開始インデックス size_t to
終了インデックス Range stuff
その間の置換する項目 from
そしてto
Returns:の中身を変えずに新しい配列を作る。subject
.See Also:std.algorithm.iteration.substitute手抜きのリプレースだ。Examples:auto a = [ 1, 2, 3, 4 ]; auto b = a.replace(1, 3, [ 9, 9, 9 ]); writeln(a); // [1, 2, 3, 4] writeln(b); // [1, 9, 9, 9, 4]
- void
replaceInPlace
(T, Range)(ref T[]array
, size_tfrom
, size_tto
, Rangestuff
)
if (is(typeof(replace(array
,from
,to
,stuff
)))); - の要素を
array
の要素をfrom
からto
(排他的)の範囲のインデックスに置き換える。stuff
.必要に応じて配列を展開または縮小する。 は,必要に応じて配列を拡張または縮小する。Parameters:T[] array
スキャンする配列 size_t from
開始インデックス size_t to
終了インデックス Range stuff
その間の置換する項目 from
そしてto
Examples:int[] a = [1, 4, 5]; replaceInPlace(a, 1u, 2u, [2, 3, 4]); writeln(a); // [1, 2, 3, 4, 5] replaceInPlace(a, 1u, 2u, cast(int[])[]); writeln(a); // [1, 3, 4, 5] replaceInPlace(a, 1u, 3u, a[2 .. 4]); writeln(a); // [1, 4, 5, 5]
- E[]
replaceFirst
(E, R1, R2)(E[]subject
, R1from
, R2to
)
if (isDynamicArray!(E[]) && isForwardRange!R1 && is(typeof(appender!(E[])().put(from
[0..1]))) && isForwardRange!R2 && is(typeof(appender!(E[])().put(to
[0..1])))); - が最初に現れる箇所を
from
をto
に置き換える。subject
.Parameters:E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
置換する項目 from
で置き換える。Returns:の中身を変えずに新しい配列に置き換える。subject
の内容を変更しない新しい配列。 の中身を変えずに新しい配列を返す。Examples:auto a = [1, 2, 2, 3, 4, 5]; auto b = a.replaceFirst([2], [1337]); writeln(b); // [1, 1337, 2, 3, 4, 5] auto s = "This is a foo foo list"; auto r = s.replaceFirst("foo", "silly"); writeln(r); // "This is a silly foo list"
- E[]
replaceLast
(E, R1, R2)(E[]subject
, R1from
, R2to
)
if (isDynamicArray!(E[]) && isForwardRange!R1 && is(typeof(appender!(E[])().put(from
[0..1]))) && isForwardRange!R2 && is(typeof(appender!(E[])().put(to
[0..1])))); - の最後の出現箇所を
from
をto
で置き換える。subject
.Parameters:E[] subject
スキャンする配列 R1 from
置換する項目 R2 to
置換する項目 from
で置き換える。Returns:の中身を変えずに新しい配列に置き換える。subject
の内容を変更しない新しい配列。 の中身を変えずに新しい配列を返す。Examples:auto a = [1, 2, 2, 3, 4, 5]; auto b = a.replaceLast([2], [1337]); writeln(b); // [1, 2, 1337, 3, 4, 5] auto s = "This is a foo foo list"; auto r = s.replaceLast("foo", "silly"); writeln(r); // "This is a foo silly list"
- inout(T)[]
replaceSlice
(T)(inout(T)[]s
, in T[]slice
, in T[]replacement
); - の項目が
slice
の項目が の項目に置き換わるように、新しい配列を作成する。replacement
.slice
で置き換えられているような新しい配列を作成する。replacement
は同じ長さである必要はない。 に置き換えられる。結果は、与えられた項目に基づいて大きくなったり小さくなったりする。Parameters:inout(T)[] s
新しい配列の底辺 T[] slice
のスライス s
置換されるT[] replacement
置換する項目 slice
で置き換える。Returns:新しい配列はs
である。slice
で置き換えられている。replacement
[].See Also:std.algorithm.iteration.substitute手抜きのリプレースだ。Examples:auto a = [1, 2, 3, 4, 5]; auto b = replaceSlice(a, a[1 .. 4], [0, 0, 0]); writeln(b); // [1, 0, 0, 0, 5]
- struct
Appender
(A) if (isDynamicArray!A); - 配列にデータを追加する出力範囲を実装する。これは より効率的なので、多くの要素を追加する場合は、array ~= data よりもこちらを推奨する。 より効率的だからだ。
Appender
配列のメタデータをローカルに保持する。 スライスの検索によるパフォーマンスの低下を避けることができる。capacity を探すことによるパフォーマンスの低下を避けることができる。Parameters:A シミュレートする配列の型を指定する。 See Also:Examples:auto app = appender!string(); string b = "abcdefg"; foreach (char c; b) app.put(c); writeln(app[]); // "abcdefg" int[] a = [ 1, 2 ]; auto app2 = appender(a); app2.put(3); app2.put([ 4, 5, 6 ]); writeln(app2[]); // [1, 2, 3, 4, 5, 6]
- @trusted this(A
arr
); - 与えられた配列でAppender を構築する。 これはデータをコピーしないことに注意。 データをコピーしないことに注意。 配列の容量が
arr
.capacity, によって決定されるように、配列がより大きな容量を持つ場合、それはアペンダによって使用される。 アペンダーを配列上で初期化した後、元の配列にアペンドすると再割り当てされる、 元の配列にアペンドすると再割り当てされる。 - void
reserve
(size_tnewCapacity
); - 少なくともnewCapacityの要素をアペンド用に確保する。 要求されたよりも多くの要素が予約される可能性がある。 より多くの要素が予約されることに注意すること。もし
newCapacity
<= capacityの場合、何もしない。 が実行される。Parameters:size_t newCapacity
Appender が持つべき容量 - const @property size_t
capacity
(); - Returns:アレイの容量 (再割り当てのトリガーとなるまでに管理アレイが収容できる要素の最大数)。 を持つべきである。)もし 追加によって再割り当てが行われる場合は、0 が返される。
- inout @property @trusted inout(T)[]
data
(); - 今後はopSlice()を使おう。Returns:管理配列。
- inout @property @trusted inout(T)[]
opSlice
(); - Returns:管理配列。
- void
put
(U)(Uitem
)
if (canPutItem!U); - 管理配列に
item
管理配列に追加する。のエンコーディングを行う。 char A 、型が異なるchar 配列の場合、型に対するエンコーディングを行う。Parameters:U item
追加する単一の項目 - void
put
(Range)(Rangeitems
)
if (canPutRange!Range); - 範囲全体を管理配列に追加する。要素のエンコーディングを行う。 char A 、型が異なるchar 配列の場合は、要素のエンコーディングを行う。Parameters:
Range items
追加する項目の範囲 - template
opOpAssign
(string op : "~") - 管理配列に追加する。See Also:
- pure nothrow @trusted void
clear
(); - 管理配列をクリアする。 これにより、配列の要素を再利用できるようになる。 を再利用できるようになる。
注釈 clearは、"@disable型"では無効である。 Appender 、不変のデータを上書きしてしまう可能性があるためである。
- pure @trusted void
shrinkTo
(size_tnewlength
); - 管理配列を指定された長さに縮小する。Throws:Exception newlengthが現在の配列の長さより大きい場合。
注釈 shrinkToは、不変要素型またはconst要素型に対しては無効である。
- const string
toString
()();
const voidtoString
(Writer)(ref Writerw
, ref scope const FormatSpec!charfmt
)
if (isOutputRange!(Writer, char)); - Appender!(A)(data) 形式の文字列を返す。Parameters:
Writer w
char 。 出力範囲。 FormatSpec!char fmt
A std.format.FormatSpec配列 を制御する。 Returns:writer が設定されていない場合はstring を、そうでない場合はvoid を指定する。
- struct
RefAppender
(A) if (isDynamicArray!A); - のバージョン。 Appenderのバージョンで、配列をインプレースで更新できる。 これは、すべての呼び出しをアペンダ実装に転送する。 アペンダへの呼び出しはすべて、渡された元の配列へのポインタを更新する。 へのポインタも更新する。
ヒント のarrayPtr オーバーロードを使用する。 appenderのオーバーロードを使う。
Parameters:A シミュレートする配列の型 Examples:int[] a = [1, 2]; auto app2 = appender(&a); writeln(app2[]); // [1, 2] writeln(a); // [1, 2] app2 ~= 3; app2 ~= [4, 5, 6]; writeln(app2[]); // [1, 2, 3, 4, 5, 6] writeln(a); // [1, 2, 3, 4, 5, 6] app2.reserve(5); assert(app2.capacity >= 5);
- this(A*
arr
); - 与えられた配列参照でRefAppender を構築する。 これは データをコピーしない。 配列の容量が
arr
.capacityによって決定されるように、配列がより大きな容量を持つ場合、それは によって決定されるように、配列がより大きな容量を持つ場合、それはアペンダによって使用される。注釈 アペンダが終了するまでは、元の配列に対して組み込みのアペンド(すなわち、~= )を使用しないこと。 を使用してはいけない。 を呼び出すと、それらのアペンドなしで配列データを再割り当てするからである。
Parameters:A* arr
配列へのポインタ。NULLであってはならない。 - void
opDispatch
(string fn, Args...)(Argsargs
)
if (__traits(compiles, (Appender!A a) => mixin("a." ~ fn ~ "(args
)"))); - 以下のような残りのAppender メソッドをラップする。 put.Parameters:
fn 呼び出すメソッド名。 Args args
メソッドに渡す引数。 - void
opOpAssign
(string op : "~", U)(Urhs
)
if (__traits(compiles, (Appender!A a) { a.put(rhs
); } )); - 管理配列に
rhs
を管理配列に追加する。Parameters:U rhs
要素または範囲。 - const @property size_t
capacity
(); - アレイの容量(再割り当てを行う前に管理アレイが収容できる要素の最大数)を返す。 を返す。) もし を追加すると再割り当てされる、
capacity
は0 を返す。 - inout @property inout(ElementEncodingType!A)[]
opSlice
(); - Returns:を返す。
- Appender!A
appender
(A)()
if (isDynamicArray!A);
Appender!(E[])appender
(A : E[], E)(auto ref Aarray
); - を返す便利な関数である。 Appenderインスタンスを返す便利な関数である、 オプションで
array
.Examples:auto w = appender!string; // 少なくとも10要素分のスペースを事前に確保する(これにより、コストのかかる再割り当てを回避できる) w.reserve(10); assert(w.capacity >= 10); w.put('a'); // 単一要素 w.put("bc"); // 複数の要素 // 追加構文を使う w ~= 'd'; w ~= "ef"; writeln(w[]); // "abcdef"
- RefAppender!(E[])
appender
(P : E[]*, E)(ParrayPtr
); - を返す便利な関数である。 RefAppenderインスタンスを返す で初期化されたインスタンスを返す。
arrayPtr
.配列ポインタにnullを使わず、他の の他のバージョンを使う。appender
を使う。Examples:int[] a = [1, 2]; auto app2 = appender(&a); writeln(app2[]); // [1, 2] writeln(a); // [1, 2] app2 ~= 3; app2 ~= [4, 5, 6]; writeln(app2[]); // [1, 2, 3, 4, 5, 6] writeln(a); // [1, 2, 3, 4, 5, 6] app2.reserve(5); assert(app2.capacity >= 5);
- T[n]
staticArray
(T, size_t n)(auto ref T[n]a
);
U[n]staticArray
(U, T, size_t n)(auto ref T[n]a
)
if (!is(T == U) && is(T : U)); - コンパイル時に長さがわかっている動的配列から静的配列を構築する。 要素の型は推測することも、明示的に指定することもできる:
- [1, 2].staticArray は以下を返す。int[2]
- [1, 2].staticArray!float 戻り値 float[2]
注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈: 注釈
staticArray
は値で返すので、大きな配列を含む式は非効率的かもしれない。Parameters:T[n] a
入力配列。 Returns:から構成される静的配列。a
.Examples:配列リテラルからの静的配列auto a = [0, 1].staticArray; static assert(is(typeof(a) == int[2])); writeln(a); // [0, 1]
Examples:要素の暗黙のキャストによる配列からの静的配列auto b = [0, 1].staticArray!long; static assert(is(typeof(b) == long[2])); writeln(b); // [0, 1]
- auto
staticArray
(size_t n, T)(scope Ta
)
if (isInputRange!T);
autostaticArray
(size_t n, T)(scope Ta
, out size_trangeLength
)
if (isInputRange!T);
autostaticArray
(Un : U[n], U, size_t n, T)(scope Ta
)
if (isInputRange!T && is(ElementType!T : U));
autostaticArray
(Un : U[n], U, size_t n, T)(scope Ta
, out size_trangeLength
)
if (isInputRange!T && is(ElementType!T : U));
autostaticArray
(alias a)()
if (isInputRange!(typeof(a)));
autostaticArray
(U, alias a)()
if (isInputRange!(typeof(a))); - 範囲から静的配列を構築する。 コンパイル時に
a
.lengthがコンパイル時にわからない場合は、要素数を をテンプレート引数として与えなければならない(例えば myrange.staticArray
!2). 元範囲の要素が暗黙のうちに要求された要素型に変換可能であれば、サイズと型を組み合わせることができる。 要求された要素型に暗黙のうちに変換可能であれば、サイズと型を組み合わせることができる (例: 2.iota.staticArray
!(long[2])).範囲a
がコンパイル時にわかっている場合、それを テンプレート引数として与えることができる。 (例えばstaticArray
!(2.iota)またはstaticArray
!(double, 2.iota)).Parameters:T a
入力範囲。静的配列の指定した長さよりも要素が少ない場合、 の残りの部分がデフォルトで初期化される。指定された要素数より多い場合は、指定された長さまでの最初の要素 までが使われる。 size_t rangeLength
から使用された要素数を出力する。 a
.オプション。Examples:範囲 + サイズからの静的配列import std.range : iota; auto input = 3.iota; auto a = input.staticArray!2; static assert(is(typeof(a) == int[2])); writeln(a); // [0, 1] auto b = input.staticArray!(long[4]); static assert(is(typeof(b) == long[4])); writeln(b); // [0, 1, 2, 0]
Examples:CTレンジからの静的配列import std.range : iota; enum a = staticArray!(2.iota); static assert(is(typeof(a) == int[2])); writeln(a); // [0, 1] enum b = staticArray!(long, 2.iota); static assert(is(typeof(b) == long[2])); writeln(b); // [0, 1]
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku