申し訳ありませんが、これは配列に関する 3 つの質問になりました
(動的) 配列は D では本当に強力だと思いますが、次のことがしばらく気になりました。
C++ では、指定された値で配列を簡単に割り当てることができましたが、DI ではその方法が見つかりませんでした。確かに、次のことは問題ありません。
int[] a = new int[N];
a[] = a0;
0
しかし、1 行目は で初期化され、2行目は で初期化されるため、効率が悪いように見えますa0
。次のようなことを D で行うことはできますか?
int[] a = new int(a0)[N]; // illegal
std.range でストライドを使用するときのもう 1 つの効率の問題:
import std.stdio;
import std.range;
struct S
{
int x;
this(this)
{
writeln("copy ", x);
}
}
void f(S[] s)
{
}
int main()
{
S[] s = new S[10];
foreach (i, ref v; s)
{
v.x = i;
}
f(stride(s, 3)); // error
return 0;
}
確かに、ストライドを使用して、要素をコピーせずに新しい配列を作成できると単純に考えていたのでしょうか。Dではそうする方法はありませんよね?
そこで、配列がストライドが返すようにシミュレートし、次のように実装f
しました。
f(s, 3);
void f(S[] s, uint stride)
{
ref S get(uint i)
{
assert (i * stride < s.length);
return s[i * stride];
}
for (uint x ... )
{
get(x) = ...;
}
}
インデックス演算子を使用して代わりに get(x) を記述する方法はありますget[x]
か? このようにして、ストライディング関数を静的にミックスイン/インクルードしget
、残りの関数を同様に保つことができました。ローカル構造体は関数スコープ変数にアクセスすることが許可されていないため、採用されたアプローチに興味があります(なぜですか?)。