C++ で配列から要素を削除する
-
C++ で
std::to_array
およびstd::remove
関数を使用して配列から要素を削除する -
std::erase
およびstd::remove
関数を使用して、C++ の配列から要素を削除する
この記事では、C++ で配列から要素を削除する方法のいくつかの方法について説明します。
C++ で std::to_array
および std::remove
関数を使用して配列から要素を削除する
配列は、C++ では固定長または動的として定義でき、どちらも要素を削除するために異なる方法が必要です。この例では、組み込みの C スタイルの固定配列を検討します。これは、これらが効率のために数値プログラムによって一般的に操作されるためです。
int
の配列を宣言し、この配列で 2 回発生する 2
の要素値を削除します。std::remove
はアルゴリズムライブラリの一部であり、指定された範囲内の指定された要素のすべてのインスタンスを削除します。
ただし、最初は、std::remove
メソッドで安全に使用するために、std::to_array
関数を使用して arr
オブジェクトを std::array
コンテナに変換します。後者のアルゴリズムは、範囲の新しい終わりのイテレータを返します。つまり、結果の array
オブジェクトにはまだ 10
要素が含まれているため、それらを新しい場所にコピーする必要があります。元のオブジェクトは C スタイルの配列であったため、8 要素の int
配列に新しいダイナミックメモリを割り当て、std::memmove
関数を使用して array
オブジェクトからコンテンツをコピーします。ただし、std::distance
関数を使用して 8
値を計算したことに注意してください。
#include <array>
#include <cstring>
#include <iostream>
#include <iterator>
using std::array;
using std::cout;
using std::endl;
using std::remove;
int main() {
int arr[10] = {1, 1, 1, 2, 2, 6, 7, 8, 9, 10};
int elem_to_remove = 2;
cout << "| ";
for (const auto &item : arr) {
cout << item << " | ";
}
cout << endl;
auto tmp = std::to_array(arr);
auto len =
std::distance(tmp.begin(), (tmp.begin(), tmp.end(), elem_to_remove));
auto new_arr = new int[len];
std::memmove(new_arr, tmp.data(), len * sizeof(int));
cout << "| ";
for (int i = 0; i < len; ++i) {
cout << new_arr[i] << " | ";
}
cout << endl;
delete[] new_arr;
return EXIT_SUCCESS;
}
出力:
| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |
std::erase
および std::remove
関数を使用して、C++ の配列から要素を削除する
この問題の別のシナリオは、指定された配列のタイプが std::vector
の場合に発生します。今回は動的配列機能があり、要素の操作に組み込み関数を使用する方が柔軟性があります。
次のサンプルコードでは、erase-remove イディオムを利用して、範囲内の指定された要素のすべてのオカレンスを削除します。std::erase
は削除の範囲を示すために 2つのイテレータを使用することに注意してください。したがって、開始点を指定するには、std::remove
アルゴリズムからの戻り値が必要です。std::remove
メソッドのみを呼び出すと、arr2
オブジェクトには-{1, 1, 1, 6, 7, 8, 9, 10, 9, 10}
のような要素が含まれることに注意してください。
#include <iostream>
#include <iterator>
#include <vector>
using std::cout;
using std::endl;
using std::remove;
using std::vector;
int main() {
vector<int> arr2 = {1, 1, 1, 2, 2, 6, 7, 8, 9, 10};
int elem_to_remove = 2;
cout << "| ";
for (const auto &item : arr2) {
cout << item << " | ";
}
cout << endl;
arr2.erase(std::remove(arr2.begin(), arr2.end(), elem_to_remove), arr2.end());
cout << "| ";
for (const auto &item : arr2) {
cout << item << " | ";
}
cout << endl;
return EXIT_SUCCESS;
}
出力:
| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |