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 |
