C++で指定したインデックス範囲[L–R]の配列要素を削除する方法
C++では、指定したインデックス範囲 [L–R] に含まれる要素を配列から効率的に取り除くことができます。本記事では、その基本的な考え方と具体的な実装方法を解説します。
アルゴリズムの考え方
まず、元の配列と削除対象となる排他的な範囲を定義し、配列の長さを求めます。
int arr[] = { 2,4,6,8,10,12,14,16,18,20};
int L = 2, R = 6;
int length = sizeof(arr) / sizeof(arr[0]);次に、配列を先頭から順に走査します。インデックス i が L 以下、または R 以上である場合(つまり削除範囲の外側にある場合)は、変数 k をインクリメントしながら要素を前方へ詰め直します。これにより、範囲内の要素は事実上「削除」されます。処理終了時の k の値が、新しい配列の長さとなります。
int k = 0;
for (int i = 0; i < length; i++) {
if (i <= L || i >= R) {
arr[k] = arr[i];
k++;
}
}サンプルコード
以下に、指定したインデックス範囲の配列要素を削除する完全な実装例を示します。
#include <iostream>
using namespace std;
int main() {
int arr[] = { 2,4,6,8,10,12,14,16,18,20};
int L = 2, R = 6;
int length = sizeof(arr) / sizeof(arr[0]);
int k = 0;
for (int i = 0; i < length; i++) {
if (i <= L || i >= R) {
arr[k] = arr[i];
k++;
}
}
length=k;
for (int i = 0; i < length; i++)
cout << arr[i] << " ";
return 0;
}出力結果
上記のコードを実行すると、次の出力が得られます。
2 4 6 14 16 18 20
処理のポイント
この手法は「上書き方式」と呼ばれ、新しい配列を別途用意する必要がないため、メモリ効率に優れています。計算量は O(n) で、配列を一度走査するだけで処理が完了します。ただし、元の配列そのものが書き換えられる点や、範囲の境界条件(L・R を含むかどうか)を要件に応じて調整する必要がある点には注意しましょう。
-
C++で配列内の不動点(インデックスと等しい値)を二分探索で効率的に検索する方法
本記事では、ソート済みの配列から「不動点(Fixed Point)」と呼ばれる特殊な要素を検索する方法を解説します。不動点とは、要素の値がそのインデックス(添字)と一致している要素のことです。プログラムは不動点が存在すればその値を返し、存在しない場合は -1 を返します。なお、配列には負の数が含まれることもあり、データ要素はソート済みであると仮定します。二分探索による効率的なアプローチすべての要素を順に確認する線形探索では O(n) の計算量が必要ですが、配列がソート済みであるという性質を利用すると、二分探索(バイナリサーチ)によって O(log n) という高速な計算量でこの問題を解くことが
-
C++における配列インデックス演算子[]のオーバーロード方法を徹底解説
C++における演算子のオーバーロードは、オブジェクト指向プログラミングの重要な機能の一つです。演算子オーバーロードは、コンパイル時ポリモーフィズム(静的ポリモーフィズム)に分類されます。本記事では、その代表例として、配列インデックス演算子 [] のオーバーロードを実装し、独自クラスでも配列のように要素へアクセスできるようにする方法を解説します。配列インデックス演算子[]をオーバーロードするメリット通常、クラス内部で管理している配列に対して [] 演算子を使うと、範囲外アクセスが発生してもコンパイラは検出してくれません。operator[] をオーバーロードすれば、以下のようなメリットがあります