Vector型の要素の中から削除したい条件で検索をかけてindexを特定し、remove 関数で削除する方法をまとめてみました。
Vector型の要素を検索して削除する
vec.iter().position(|x| *x == target_x)
で位置を特定vec.remove(index)
で削除するvec.retain(|&x| x != keep_x)
で条件に一致する要素のみを保持する方法も!
目次
removeで削除
remove 関数の引数はindex: usize
のみなので、削除対象の位置がわからない場合は事前に検索をかけてindexを特定した上で削除する必要があります。
位置を特定してremoveで削除する
position
positionでは、条件に一致する最初の要素の位置を取得することができます。
fn main() {
let mut vec = vec![1, 2, 3, 2, 4, 5];
if let Some(remove_index) = vec.iter().position(|x| *x == 2) {
vec.remove(remove_index);
}
assert_eq!(vec, vec![1, 3, 2, 4, 5]);
}
rposition
rpositionでは、条件に一致する最後の要素の位置を取得することができます。
fn main() {
let mut vec = vec![1, 2, 3, 2, 4, 5];
if let Some(remove_index) = vec.iter().rposition(|x| *x == 2) {
vec.remove(remove_index);
}
assert_eq!(vec, vec![1, 2, 3, 4, 5]);
}
retainで条件に一致する要素のみを保持する
removeではなく、retain 関数を使うことで条件に一致する要素のみを保持することができ、条件次第では削除したい要素すべてを削除することが可能です。
fn main() {
let mut vec = vec![1, 2, 3, 2, 4, 5];
vec.retain(|&x| x != 2);
assert_eq!(vec, vec![1, 3, 4, 5]);
}
また、Rust の公式ドキュメントでは以下のような方法も紹介されていました。
fn main() {
// ターゲットとなるVector
let mut vec = vec![1, 2, 3, 2, 4, 5];
// vecと対応するように保持する要素をtrueで表現したVector
let keep = [true, false, true, false, true, true];
let mut iter = keep.iter();
vec.retain(|_| *iter.next().unwrap());
assert_eq!(vec, vec![1, 3, 4, 5]);
}
.unwrap()
で雑に処理しているため、keep
の要素数がvec
より少ないとパニックが発生しエラーとなるので注意してください。
まとめ
Vec 型の要素を操作するのは、なかなか難しい…
参考
著:初田直也, 著:山口聖弘, 著:吉川哲史, 著:豊田優貴, 著:松本健太郎, 著:原将己, 著:中村謙弘, 著:フォルシア株式会社
¥3,208 (2024/11/01 18:58時点 | Amazon調べ)
ポチップ
コメント