C++ で配列から要素を削除する

胡金庫 2023年10月12日
  1. C++ で std::to_array および std::remove 関数を使用して配列から要素を削除する
  2. std::erase および std::remove 関数を使用して、C++ の配列から要素を削除する
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 |
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Array