Объединение элемента x
в массив items
легко в D, это как если бы это был список массивов:
arr ~= x;
но как удалить элемент в индексе i
из items
?
(Предостережение: если я удалю элемент и добавлю новый элемент, массив не должен быть перераспределен. Таким образом, простой срез не будет работать.)
Обновление:
На основании ответа CyberShadow об использовании assumeSafeAppend
, я написал этот код:
static void removeAt(T)(ref T[] arr, size_t index)
{
foreach (i, ref item; arr[index .. $ - 1])
item = arr[i + 1];
arr = arr[0 .. $ - 1];
arr.assumeSafeAppend();
}
Однако проблема возникает, когда у вас есть что-то вроде:
auto superArr = [0, 1, 2, 3, 4]; //Must not be modified
auto arr = superArr[0 .. $ - 1];
writeln(superArr);
arr.removeAt(0); //Should copy the slice and modify the copy
writeln(superArr); //but obviously doesn't
Базовый массив среза должен быть не изменен, если элемент удален из среза; вместо этого нужно скопировать фрагмент.
Но у меня нет способа узнать, является ли массив срезом большего массива... так что это не работает.
Любые предложения?