C++で指定したインデックス範囲[L–R]の配列要素を削除する方法
このチュートリアルでは、C++を使って配列から指定されたインデックス範囲の要素を削除する方法を解説します。アルゴリズムの基本的な考え方から、実際のコード実装・実行結果まで、順を追って見ていきましょう。
解決の手順
- 配列と、削除対象となるインデックス範囲 [L, R] を初期化します。
- 新しいインデックスを管理する変数を用意します。
- 配列全体を走査します。
- 現在のインデックスが指定範囲外であれば、その要素を新しいインデックスの位置に書き込みます。
- 新しいインデックスを1つ進めます。
- 走査が終わったら、新しいインデックス(= 残った要素数)を返します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
// 指定範囲外の要素だけを前方に詰める関数
int deleteElementsInRange(int arr[], int n, int l, int r) {
int i, newIndex = 0;
for (i = 0; i < n; i++) {
// 現在のインデックスが範囲外なら要素を残す
if (i <= l || i >= r) {
arr[newIndex] = arr[i];
newIndex++;
}
}
// 更新後のインデックス(要素数)を返す
return newIndex;
}
int main() {
int n = 9, l = 1, r = 6;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int updatedArrayLength = deleteElementsInRange(arr, n, l, r);
for (int i = 0; i < updatedArrayLength; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
1 2 7 8 9
処理のポイント
このアルゴリズムは上書き方式を採用しています。削除対象の要素をスキップしながら、残すべき要素を配列の先頭側へ順番に詰めていくことで、追加のメモリを確保することなく、時間計算量 O(n) で処理を完了できます。
条件式 i <= l || i >= r によって、インデックス l + 1 から r - 1 までの要素が削除対象になります。つまり、範囲の両端にあたるインデックス l と r の要素はそのまま保持されます。上記の例では、インデックス2〜5の要素(3, 4, 5, 6)が削除され、「1 2 7 8 9」が出力されます。
まとめ
本記事では、C++で配列の指定されたインデックス範囲の要素を削除する方法を紹介しました。シンプルなループ処理だけで実装できるため、競技プログラミングや実務のさまざまな場面で応用できるテクニックです。チュートリアルについてご不明な点があれば、コメント欄でお気軽にお尋ねください。
-
C++における配列インデックス演算子[]のオーバーロード方法を徹底解説
C++における演算子のオーバーロードは、オブジェクト指向プログラミングの重要な機能の一つです。演算子オーバーロードは、コンパイル時ポリモーフィズム(静的ポリモーフィズム)に分類されます。本記事では、その代表例として、配列インデックス演算子 [] のオーバーロードを実装し、独自クラスでも配列のように要素へアクセスできるようにする方法を解説します。配列インデックス演算子[]をオーバーロードするメリット通常、クラス内部で管理している配列に対して [] 演算子を使うと、範囲外アクセスが発生してもコンパイラは検出してくれません。operator[] をオーバーロードすれば、以下のようなメリットがあります
-
C++で配列の最大要素とその位置を見つける方法
配列の最大要素とは配列には複数の要素が格納されており、その中で他のすべての要素よりも大きい値を持つものが「最大要素」です。具体例51724上記の配列の場合、最大要素は7であり、インデックス2の位置に存在します。それでは、配列の最大要素を求めるC++プログラムを見ていきましょう。サンプルコード#include <iostream> using namespace std; int main() { int a[] = {4, 9, 1, 3, 8}; int largest, i, pos; largest = a[0]; for(i=1; i<