要素の削除
CoddyのRustジャーニー「論理とフロー」セクションの一部。レッスン 13/66。
ベクターから要素を追加するだけでなく、削除する必要がある場合もあります。Rustには要素を削除するための主な方法が2つあり、それぞれ異なる状況に適しています。
.pop()メソッドは、ベクターの最後の要素を削除して返します。
let mut numbers = vec![10, 20, 30, 40];
let last = numbers.pop(); // 40を取り除き、Some(40)を返す
// numbersは現在[10, 20, 30].pop()はOptionを返すことに注意してください。削除する要素があった場合はSome(value)を、ベクターがすでに空だった場合はNoneを返します。そのため、空のベクターに対しても安全に使用できます。
.remove()メソッドは、指定したインデックスにある要素を削除し、その要素を返します。
let mut fruits = vec!["apple", "banana", "cherry"];
let removed = fruits.remove(1); // "banana"を削除する
// fruitsは現在["apple", "cherry"]になっている.remove()を使うと、削除したインデックスより後ろのすべての要素が左に移動し、空いた場所を埋めます。先頭や中央から削除する場合、多くの要素を移動する必要があるため、この操作は大きなベクターでは遅くなることがあります。
どちらのメソッドも内容を変更するため、ベクターが可変である必要があります。末尾から削除したい場合は.pop()を、特定の位置から削除したい場合は.remove()を選びましょう。
チャレンジ
簡単入力を2つ受け取ります。1つ目はカンマ区切りの数値のリスト、2つ目は削除するインデックスです。開始コードはすでに両方の入力を読み取り、数値を可変ベクター numbers に変換しています。指定されたインデックスの要素を削除し、残りの要素を1行ずつ出力してください。
要件:
- 2つ目の入力(
index_input)を、インデックスを表す整数に変換する .remove()を使って、そのインデックスの要素を削除する- 残りの要素を1行ずつ出力する
入力:
- 1行目: カンマ区切りの整数(例:
10,20,30,40,50) - 2行目: 削除するインデックスを表す整数
出力: ベクターの残りの要素を1行ずつ出力する
自分で試してみよう
use std::io;
fn main() {
// カンマ区切りの数値を読み込む
let mut numbers_input = String::new();
io::stdin().read_line(&mut numbers_input).expect("Failed to read line");
// 削除する要素のインデックスを読み込む
let mut index_input = String::new();
io::stdin().read_line(&mut index_input).expect("Failed to read line");
// "10,20,30" をベクターに変換する:カンマで分割し、各部分を数値として解析して、Vec にまとめる
let mut numbers: Vec<i32> = numbers_input
.trim()
.split(',')
.map(|s| s.trim().parse().unwrap())
.collect();
// TODO: 以下にコードを書く
// 1. index_input を整数に変換する
// 2. 指定されたインデックスの要素を削除する
// 3. 残りの各要素を1行ずつ出力する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Rustオンラインコンパイラ