Векторы и динамические массивы в D

Я думал, что динамические массивы были заменой векторов в D, но, похоже, у них нет функции удаления (есть только у ассоциативных массивов), что является скорее ограничением для вектора, поэтому мне интересно, правильно ли я понял. Если у вас есть массив, подобный следующему,

uint[] a;
a.length = 3;
a[0] = 1;
a[1] = 2;
a[2] = 3;

Тогда единственный способ, который я нашел, чтобы удалить, скажем, второй элемент,

a = a[0..1] ~ a[2];

Но это не кажется правильным (но, может быть, только потому, что я еще не все понимаю). Так существует ли вектор и есть ли другой способ удаления элемента из динамического массива?

Спасибо.


person tjm    schedule 10.10.2010    source источник


Ответы (2)


Вы можете использовать std.algorithm.remove(), который работает не только с массивами, но и с общими диапазонами. Пример:

import std.algorithm;

void main() {
    uint[] a = [1, 2, 3];
    a = a.remove(1);
    assert(a == [1, 3]);
}
person dsimcha    schedule 10.10.2010
comment
Верно, хотя Array, вероятно, будет лучше, если вы действительно ищете вектор, поскольку Array не должен изменять размер своего внутреннего массива каждый раз, когда вы добавляете или удаляете что-либо в него или из него. - person Jonathan M Davis; 11.10.2010
comment
@Jonathan: Вы знаете, является ли это требованием спецификации языка или это определено реализацией? то есть может ли компилятор реализовать встроенный массив, например std.container.Array? - person Peter Alexander; 11.10.2010
comment
Я не знаю, каковы точные требования. У компилятора есть некоторая свобода действий, но я очень сомневаюсь, что он будет (и я не думаю, что должен) выделять вдвое больше памяти, чем ему нужно в общем случае. У массивов есть свойство емкости, которое говорит вам, сколько элементов вы можете добавить к нему, прежде чем его придется перераспределить, и если вы поиграете с ним, вы увидите, что он определенно сохраняет некоторую дополнительную память, но, возможно, это было бы немного пожирает память, если пытается сохранить столько же дополнительной памяти, сколько Array. digitalmars.com/d/2.0/arrays.html - person Jonathan M Davis; 11.10.2010
comment
Нет необходимости выделять двойную память. Например, std::vector обычно выделяет на 50 % больше (то есть в среднем на 25 % больше), что не слишком экстравагантно. Я бы предпочел время от времени выделять немного больше памяти, чем выделять ее при каждой конкатенации. - person Peter Alexander; 13.10.2010

В std.container есть шаблон Array!T, который очень похож на std::vector из C++.

Array!int a = [0, 1, 2, 3];
a.linearRemove(a[1..3]);
assert(equal(a, [0, 3]));

К сожалению, у него нет отдельного метода удаления, хотя вы всегда можете использовать linearRemove с одноэлементным диапазоном.

person Peter Alexander    schedule 10.10.2010