線形時間で、の途中&[T]
またはVec<T>
先頭に複数の要素を挿入または置換する簡単な方法はありますか?Vec
私は見つけることができたstd::vec::Vec::insert
ただし、これは時間内に単一の要素を挿入するためだけのものなのでO(n)
、ループ内で呼び出すことはできません。
私できたsplit_off
そのインデックスでa を実行し、extend
新しい要素を分割の左半分に、次にextend
2 番目の半分を最初の半分に挿入しますが、もっと良い方法はありますか?
ベストアンサー1
Rust 1.21.0以降では、Vec::splice
は利用可能であり、完全な先頭への追加を含め、任意の時点で挿入できます。
let mut vec = vec![1, 5];
let slice = &[2, 3, 4];
vec.splice(1..1, slice.iter().cloned());
println!("{:?}", vec); // [1, 2, 3, 4, 5]
ドキュメントには次のように記載されています:
注 4: 次の場合に最適です:
- 末尾(ベクトル内の範囲の後の要素)は空です
- または
replace_with
範囲の長さよりも少ない要素を生成します- またはその下限が
size_hint()
正確です。
この場合、スライスの反復子の下限は正確である必要があるため、1 回のメモリ移動を実行する必要があります。
splice
値の範囲を削除し (最初の引数)、新しい値を挿入し (2 番目の引数)、オプションで古い値を取得できる (呼び出しの結果) という点で、少し強力です。
アイテムセットの置き換え
let mut vec = vec![0, 1, 5];
let slice = &[2, 3, 4];
vec.splice(..2, slice.iter().cloned());
println!("{:?}", vec); // [2, 3, 4, 5]
以前の値を取得する
let mut vec = vec![0, 1, 2, 3, 4];
let slice = &[9, 8, 7];
let old: Vec<_> = vec.splice(3.., slice.iter().cloned()).collect();
println!("{:?}", vec); // [0, 1, 2, 9, 8, 7]
println!("{:?}", old); // [3, 4]