C++ で配列のサイズを変更する
胡金庫
2023年10月12日
この記事では、C++ で配列のサイズを変更する方法を複数紹介します。
C++ で resize
メソッドを使用して配列のサイズを変更する
C++ では固定長の配列コンテナはリサイズされないことになっているので、ここでは std::vector
クラスに注目します。resize
は vector
コンテナに組み込まれた関数であり、ベクトルが含む要素数を変更します。この関数は、第 1 引数 count
が vector
の現在のサイズよりも小さい場合に要素数を減らすことができます。そうでない場合、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
メソッドを使用して配列内の要素の数を減らする
関数 erase
は std::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
著者: 胡金庫