Извините, это стало трехкратным вопросом относительно массивов.
Я думаю, что (динамические) массивы действительно мощные в D, но некоторое время меня беспокоило следующее:
ВC ++ Я мог бы легко выделить массив с обозначенными значениями, но в D я не нашел способа сделать это.Конечно, следующие проблемы не представляют проблемы:
int[] a = new int[N];
a[] = a0;
Но это выглядит неэффективно, поскольку строка 1 будет инициализироваться с 0
, а 2 - с a0
.Может ли что-то похожее на следующее может быть сделано в D?
int[] a = new int(a0)[N]; // illegal
Еще один вопрос эффективности, который я имею при использовании шага в std.range:
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
и сохранять остальные функции похожими.Я был бы заинтересован в выбранном подходе, поскольку локальной структуре не разрешен доступ к переменным области действия функции (почему бы и нет?).