Vec の途中または先頭に複数の要素を効率的に挿入または置換するには? 質問する

Vec の途中または先頭に複数の要素を効率的に挿入または置換するには? 質問する

線形時間で、の途中&[T]またはVec<T>先頭に複数の要素を挿入または置換する簡単な方法はありますか?Vec

私は見つけることができたstd::vec::Vec::insertただし、これは時間内に単一の要素を挿入するためだけのものなのでO(n)、ループ内で呼び出すことはできません。

できたsplit_offそのインデックスでa を実行し、extend新しい要素を分割の左半分に、次にextend2 番目の半分を最初の半分に挿入しますが、もっと良い方法はありますか?

ベストアンサー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]

おすすめ記事