C++ で配列のサイズを変更する

胡金庫 2023年10月12日
  1. C++ で resize メソッドを使用して配列のサイズを変更する
  2. C++ で erase メソッドを使用して配列内の要素の数を減らする
  3. カスタム定義関数を使用する C++ で配列のサイズを変更する
C++ で配列のサイズを変更する

この記事では、C++ で配列のサイズを変更する方法を複数紹介します。

C++ で resize メソッドを使用して配列のサイズを変更する

C++ では固定長の配列コンテナはリサイズされないことになっているので、ここでは std::vector クラスに注目します。resizevector コンテナに組み込まれた関数であり、ベクトルが含む要素数を変更します。この関数は、第 1 引数 countvector の現在のサイズよりも小さい場合に要素数を減らすことができます。そうでない場合、count の値がベクトルのサイズよりも大きい場合、resize はデフォルト値が 0 の要素を追加で挿入するか、ユーザが第 2 引数に希望する値を指定することができます。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1             : ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;

  i_vec1.resize(i_vec1.size() - 2);

  cout << "i_vec1 (resized -2): ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

i_vec1             : 12; 32; 43; 53; 23; 65; 84;
size: 7
i_vec1 (resized -2): 12; 32; 43; 53; 23;
size: 5

C++ で erase メソッドを使用して配列内の要素の数を減らする

関数 erasestd::vector クラスのもう一つの組み込みメソッドであり、vector から一つの要素を削除したり、対応するイテレータで指定した範囲全体を削除したりすることができます。

次の例では、整数の vector から要素 2 から末尾までの範囲を削除しています。範囲のパラメータを begin/end のイテレータで渡すのが一般的であることに注意してください。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1          : ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;

  i_vec1.erase(i_vec1.begin() + 2, i_vec1.end());

  cout << "i_vec1 (resized): ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

i_vec1          : 12; 32; 43; 53; 23; 65; 84;
size: 7
i_vec1 (resized): 12; 32;
size: 2

カスタム定義関数を使用する C++ で配列のサイズを変更する

あるいは、ベクトルを反復処理して、ベクトルの末尾から指定された数の要素を削除する別の関数を定義することもできます。これは、vector の最後の要素を削除する組み込み関数 pop_back を用いて実装することができます。次のコードサンプルに示すように、T 型のベクトルとそこから削除する要素を指定するための resizeVector 関数テンプレートが定義されています。

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

template <typename T>
void resizeVector(vector<T> &vec, int elems) {
  for (auto i = 0; i < elems; ++i) {
    vec.pop_back();
  }
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1          : ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;

  resizeVector(i_vec1, 3);

  cout << "i_vec1 (resized): ";
  printVectorElements(i_vec1);
  cout << "size: " << i_vec1.size() << endl;
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

i_vec1          : 12; 32; 43; 53; 23; 65; 84;
size: 7
i_vec1 (resized): 12; 32; 43; 53;
size: 4
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C++ Array