web-dev-qa-db-ja.com

Rustでベクトルを連結する最良の方法

Rustでベクターを連結することも可能ですか?もしそうなら、そうするエレガントな方法はありますか?私はこのようなものを持っています:

let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

for val in &b {
    a.Push(val);
}

誰もがより良い方法を知っていますか?

35
Joe Thomas

構造体_std::vec::Vec_には、メソッド append() があります。

_fn append(&mut self, other: &mut Vec<T>)
_

otherのすべての要素をSelfに移動し、otherを空のままにします。

あなたの例から、次のコードはmutatingabによって2つのベクトルを連結します:

_fn main() {
    let mut a = vec![1, 2, 3];
    let mut b = vec![4, 5, 6];

    a.append(&mut b);

    assert_eq!(a, [1, 2, 3, 4, 5, 6]);
    assert_eq!(b, []);
}
_

あるいは、 Extend::extend() を使用して、イテレータに変換できるもの(Vecなど)のすべての要素を特定のベクトルに追加できます。

_let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
// b is moved and can't be used anymore
_

ベクトルbは空ではなく移動されることに注意してください。ベクトルに Copy を実装する要素が含まれる場合、移動を避けるために、代わりに1つのベクトルへの不変の参照をextend()に渡すことができます。その場合、ベクトルbは変更されません。

_let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];

a.extend(&b);
assert_eq!(a, [1, 2, 3, 4, 5, 6]);
assert_eq!(b, [4, 5, 6]);
_
49
Lud

1行で作成できません。 Damian Dziaduch

chain() を使用して、1行で実行できます。

let c: Vec<i32> = a.into_iter().chain(b.into_iter()).collect(); // Consumed
let c: Vec<&i32> = a.iter().chain(b.iter()).collect(); // Referenced
let c: Vec<i32> = a.iter().cloned().chain(b.iter().cloned()).collect(); // Cloned
let c: Vec<i32> = a.iter().copied().chain(b.iter().copied()).collect(); // Copied

無限の方法があります。

2
Stargateur