要素の削除
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 16/56。
不要になった要素をベクターから削除する必要がある場合があります。ベクターでは、.erase()メソッドにイテレーターを使用する必要があります。std::find()と.erase()を組み合わせると、値を指定して要素を削除できます。
ベクターから要素を削除する方法は次のとおりです。std::find()は<algorithm>ヘッダーに含まれているので、<vector>と一緒にインクルードします。
#include <algorithm>
#include <vector>
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()を返します。これを確認することでエラーを防げます。
このパターンを使うと、要素の削除を安全かつ予測可能に行えます。ユーザー入力やプログラムのロジックに基づいて特定の項目を削除する必要がある、動的なコレクションの管理に特に役立ちます。削除する前に、イテレーターが有効かどうかを必ず確認してください。
チャレンジ
簡単.erase()メソッドとstd::find()を組み合わせて、std::vectorから要素を削除する方法を示すプログラムを作成してください。この課題では、ベクターから特定の要素を安全に削除し、その結果を確認する方法についての理解度を確かめます。
以下の入力が与えられます。
- ベクターに最初に追加する要素数を表す整数
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ループを使って、残った要素を現在の順序で出力してください。
自分で試してみよう
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 追加する要素の数を読み込む
int n;
cin >> n;
// 空のvectorを作成する
vector<int> myVector;
// n個の要素を読み込んで挿入する
for (int i = 0; i < n; i++) {
int element;
cin >> element;
// 要素をvectorに挿入する
}
// 削除する要素の数を読み込む
int m;
cin >> m;
// TODO: 以下にコードを書く
// 1. vectorの初期サイズを出力する
// 2. 削除する各要素を見つけて.erase()を使用し、削除するたびにサイズを出力する
// 3. vectorに残っている要素を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ