配列があるとします。指定された値を持つ配列内のすべての要素を削除したいと思います。誰かがこれを行う方法を知っていますか?削除しようとしている値は複数回発生する可能性があり、配列は必ずしも並べ替えられていません。新しい配列を作成するのではなく、その場で配列をフィルタリングしたいと思います。たとえば2
、配列から値を削除[1, 2, 3, 2, 4]
すると、結果が生成され[1, 3, 4]
ます。
これは私が思いつくことができる最高のものです:
T[] without(T)(T[] stuff, T thingToExclude) {
auto length = stuff.length;
T[] result;
foreach (thing; stuff) {
if (thing != thingToExclude) {
result ~= thing;
}
}
return result;
}
stuff = stuff.without(thingToExclude);
writeln(stuff);
これは不必要に複雑で非効率的なようです。もっと簡単な方法はありますか?私は標準ライブラリのstd.algorithmモジュールを見て、何か役立つものを見つけたいと思っていましたが、それが私が望んでいたことを実行するように見えるものはすべて問題がありました。これがうまくいかなかった私が試したもののいくつかの例です:
import std.stdio, std.algorithm, std.conv;
auto stuff = [1, 2, 3, 2, 4];
auto thingToExclude = 2;
/* Works fine with a hard-coded constant but compiler throws an error when
given a value unknowable by the compiler:
variable thingToExclude cannot be read at compile time */
stuff = filter!("a != " ~ to!string(thingToExclude))(stuff);
writeln(stuff);
/* Works fine if I pass the result directly to writeln but compiler throws
an error if I try assigning it to a variable such as stuff:
cannot implicitly convert expression (filter(stuff)) of type FilterResult!(__lambda2,int[]) to int[] */
stuff = filter!((a) { return a != thingToExclude; })(stuff);
writeln(stuff);
/* Mysterious error from compiler:
template to(A...) if (!isRawStaticArray!(A)) cannot be sliced with [] */
stuff = to!int[](filter!((a) { return a != thingToExclude; })(stuff));
writeln(stuff);
では、インデックスが表示される場所を知らなくても、配列からすべての値を削除するにはどうすればよいですか?