要素の削除
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 16/56。
時には、不要になった要素をベクタから削除する必要があります。ベクタでは、.erase() メソッドでイテレータを使用する必要があります。std::find() と .erase() を組み合わせることで、値によって要素を削除できます。
ベクターから要素を削除する方法は次のとおりです:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // イテレータの位置にある要素を削除します
}erase() を呼び出した後、その位置にある要素が削除され、後続のすべての要素が詰められます。存在しない要素を検索して削除しようとした場合、find() は end() を返し、これをチェックすることでエラーを防ぐことができます。
このパターンにより、要素の削除が安全で予測可能になります。これは、ユーザー入力やプログラムのロジックに基づいて特定のアイテムを削除する必要がある動的なコレクションを維持する場合に特に便利です。削除する前に、イテレータが有効であることを常に確認することを忘れないでください。
チャレンジ
簡単std::vector から .erase() メソッドと std::find() を組み合わせて要素を削除する方法を示すプログラムを作成してください。このチャレンジでは、ベクターから特定の要素を安全に削除し、その結果を観察する方法についての理解をテストします。
以下の入力が提供されます:
- ベクターに最初に追加する要素の数を示す整数
n - 次に、ベクターに挿入される
n個の整数 - 削除する要素の数を示す整数
m - 次に、ベクターから削除する要素を示す
m個の整数
プログラムは以下の手順を実行する必要があります:
- 空の
std::vector<int>を作成する - 追加する要素の数を読み取り、
.push_back()を使用してそれらをベクターに挿入する - すべての挿入が完了した後、初期のベクターのサイズを出力する
- 削除する要素の数を読み取る
- 削除する各要素について、
std::find()を使用してその場所を特定し、見つかった場合は.erase()を使用して削除する - 各削除の試行の後、ベクターの現在のサイズを出力する
- 最後に、ベクターに残っている要素を順番に反復処理して出力する
以下の正確な出力形式を使用してください:
初期のベクターサイズ:
Initial size: [size]各削除の試行後:
After removing [number]: size = [current_size]最終的に残った要素:
Remaining elements: [element1] [element2] [element3] ....erase() はイテレータを必要とするため、まず std::find() を使用して要素を特定する必要があることに注意してください。削除する前に、必ず要素が見つかったかどうかを確認してください。残りの要素を現在の順序で出力するには、範囲ベースの for ループを使用してください。
チートシート
vectorから特定の要素を削除するには、std::find()と.erase()を組み合わせて使用します:
std::vector<int> numbers = {10, 20, 30, 40};
auto it = std::find(numbers.begin(), numbers.end(), 20);
if (it != numbers.end()) {
numbers.erase(it); // イテレータの位置にある要素を削除します
}未定義の動作を避けるため、削除する前に必ずイテレータがend()と等しくないことを確認してください。.erase()メソッドは、値を直接受け取るのではなく、イテレータを必要とします。
自分で試してみよう
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 追加する要素の数を読み込む
int n;
cin >> n;
// 空のベクターを作成する
vector<int> myVector;
// n個の要素を読み込んで挿入する
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// ベクターに要素を挿入する
}
// 削除する要素の数を読み込む
int m;
cin >> m;
// TODO: 以下にコードを記述してください
// 1. ベクターの初期サイズを出力する
// 2. 削除する各要素について、それを見つけて .erase() を使用し、削除するたびにサイズを出力する
// 3. ベクターに残っている要素を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。