要素の削除
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 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() を使用すると、削除されたインデックス以降のすべての要素が、その隙間を埋めるために左にシフトします。この操作は、ベクタの先頭や中間から削除する場合、大きなベクタでは低速になる可能性があります。なぜなら、多くの要素を移動させる必要があるからです。
どちらのメソッドも内容を変更するため、ベクタが可変(mutable)である必要があります。末尾から要素を削除したい場合は.pop()を、特定のインデックスから削除する必要がある場合は.remove()を選択してください。
チャレンジ
簡単2つの入力が与えられます。1つ目はカンマ区切りの数値リスト、2つ目は削除するインデックスです。両方の入力を読み取り、数値からベクタを作成し、指定されたインデックスの要素を削除して、残りの要素を個別の行に出力してください。
要件:
- カンマ区切りの数値を含む最初の入力を読み取ります(例:
10,20,30,40,50) - 文字列をカンマで分割し、各数値を整数に変換します
- これらの数値から可変(mutable)なベクタを作成します
- 2番目の入力を読み取り、それをインデックスを表す整数に変換します
.remove()を使用して、そのインデックスにある要素を削除します- 残りの各要素を個別の行に出力します
入力:
- 1行目:カンマ区切りの整数(例:
10,20,30,40,50) - 2行目:削除するインデックスを表す整数
出力: ベクタの残りの各要素を個別の行に出力します
チートシート
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()を使用すると、削除されたインデックス以降のすべての要素が左にシフトして隙間を埋めます。
どちらのメソッドも、ベクタが可変(mutable)である必要があります。末尾から削除する場合は.pop()を、特定の場所から削除する場合は.remove()を使用してください。
自分で試してみよう
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");
// TODO: 以下にコードを記述してください
// 1. numbers_inputをカンマで分割し、整数に変換する
// 2. これらの数値からミュータブルなベクタを作成する
// 3. index_inputを整数に変換する
// 4. 指定されたインデックスの要素を削除する
// 5. 残りの各要素を個別の行に出力する
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。