Как элементы вектора сдвигаются влево в Rust?

Есть ли безопасный способ сдвига элементов вектора влево в Rust? (vec![1, 2, 3] становится vec![3] при сдвиге влево на две позиции). Я имею дело с типами Copy, и я не хочу платить больше, чем за memmove.

Единственное решение, которое я нашел, небезопасно: использовать memmove напрямую через ptr::copy.


person Doe    schedule 06.07.2016    source источник


Ответы (1)


Я бы использовал Vec::drain.

Вы можете вызвать его с рядом элементов, которые хотите удалить, и впоследствии он их переместит. Пример: (манеж)

fn main() {
    let mut v = vec![1, 2, 3];

    v.drain(0..2);

    assert_eq!(vec![3], v);
}

Еще одно замечание:

Я имею дело с типами Copy, и я не хочу платить больше, чем за memmove.

Стоит отметить, что перемещение всегда соответствует memcpy в Rust, поэтому различие Copy и не Copy здесь не имеет значения. Было бы то же самое, если бы типы не были Copy.

person Steve Klabnik    schedule 06.07.2016