Rustでベクターを連結することも可能ですか?もしそうなら、そうするエレガントな方法はありますか?私はこのようなものを持っています:
let mut a = vec![1, 2, 3];
let b = vec![4, 5, 6];
for val in &b {
a.Push(val);
}
誰もがより良い方法を知っていますか?
構造体_std::vec::Vec
_には、メソッド append()
があります。
_fn append(&mut self, other: &mut Vec<T>)
_
other
のすべての要素をSelf
に移動し、other
を空のままにします。
あなたの例から、次のコードはmutatinga
とb
によって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]);
_
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
無限の方法があります。