C++のSTLでstd::arrayを実装するサンプルプログラム
C++のSTL(標準テンプレートライブラリ)には、固定長の配列を安全かつ便利に扱えるコンテナstd::arrayが用意されています。本記事では、配列に対するさまざまな操作(サイズの取得・要素の挿入・先頭/末尾要素の参照・全要素の表示など)をメニュー形式で選択できるサンプルプログラムを、擬似コード・実際のコード・実行結果とあわせて解説します。
配列に対する操作と擬似コード
まず、プログラム全体の流れを擬似コードで確認しましょう。
開始
main()関数内で
TRUEの間、以下を繰り返す
選択肢を表示する
選択内容を入力として受け取る
switch文による分岐を開始する
caseが1のとき
配列のサイズを表示する
break
caseが2のとき
配列に値を挿入する
break
caseが3のとき
配列の先頭要素を表示する
break
caseが4のとき
配列の末尾要素を表示する
break
caseが5のとき
配列の全要素を表示する
break
caseが6のとき
プログラムを終了する
defaultのとき
不正な入力であることを表示する
終了。
サンプルコード
#include <iostream>
#include <array>
#include <cstdlib>
using namespace std;
int main() {
array<int, 7> a; // 要素数7の配列を宣言
array<int, 7>::iterator it; // 配列のイテレータを宣言
int c, i; // 整数型変数を宣言
a.fill(0); // 全要素を0で初期化
int cnt = 0; // 次に値を挿入する位置を管理するカウンタ
while (1) {
cout<<"1.配列のサイズを表示"<<endl;
cout<<"2.配列に要素を挿入"<<endl;
cout<<"3.配列の先頭要素を表示"<<endl;
cout<<"4.配列の末尾要素を表示"<<endl;
cout<<"5.配列の全要素を表示"<<endl;
cout<<"6.終了"<<endl;
cout<<"選択してください: ";
cin>>c;
switch(c) {
case 1:
cout<<"配列のサイズ: "; // 配列のサイズを表示
cout<<a.size()<<endl;
break;
case 2:
cout<<"挿入する値を入力してください: "; // 配列に値を挿入
cin>>i;
a.at(cnt) = i;
cnt++;
break;
case 3:
cout<<"配列の先頭要素: "; // 配列の先頭要素を表示
cout<<a.front()<<endl;
break;
case 4:
cout<<"配列の末尾要素: "; // 配列の末尾要素を表示
cout<<a.back()<<endl;
break;
case 5:
for (it = a.begin(); it != a.end(); ++it ) // 配列の全要素を表示
cout <<" "<< *it;
cout<<endl;
break;
case 6:
exit(1); // プログラムを終了
break;
default:
cout<<"正しい番号を選択してください"<<endl;
}
}
return 0;
}
使用している主なメンバ関数
- fill():配列の全要素を指定した値で埋めます。ここでは初期化のために0を設定しています。
- size():配列に格納されている要素数(この例では常に7)を返します。
- at():指定した位置の要素にアクセスします。範囲外にアクセスした場合はout_of_range例外を送出するため、[]演算子よりも安全です。
- front():先頭要素への参照を返します。
- back():末尾要素への参照を返します。
- begin() / end():それぞれ先頭と末尾の次の位置を指すイテレータを返し、ループによる全要素の走査に利用できます。
なお、このプログラムでは挿入位置を管理する変数cntを使ってa.at(cnt)に順番に値を格納しています。要素数(この例では7)を超えて挿入しようとするとout_of_range例外が発生するため、実用的なコードでは挿入前にcntとsize()を比較してチェックするのが安全です。
実行結果
1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 1 配列のサイズ: 7 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 7 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 6 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 5 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 4 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 3 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 2 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 2 挿入する値を入力してください: 1 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 3 配列の先頭要素: 7 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 4 配列の末尾要素: 1 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 5 7 6 5 4 3 2 1 1.配列のサイズを表示 2.配列に要素を挿入 3.配列の先頭要素を表示 4.配列の末尾要素を表示 5.配列の全要素を表示 6.終了 選択してください: 6 exit status 1
-
C++のSTLでset_intersectionを実装し、2つの集合の積集合を求める方法
2つの集合の積集合(インターセクション)とは、両方の集合に共通して含まれる要素だけを集めたものです。set_intersection関数によってコピーされる要素は、必ず最初の集合から取り出され、元の順序がそのまま維持されます。また、この関数を正しく動作させるためには、処理前に両方の集合がそれぞれソート済みである必要があります。 集合に対する代表的な操作には、以下のようなものがあります。 和集合(ユニオン) 積集合(インターセクション) 対称差(排他的論理和・XOR) 差集合(減算) アルゴリズム Begin 結果を格納するvector型変数vとイテレータstを宣言する。 st =
-
【C++】STLのset_differenceを使って2つの集合の差分を求める方法
2つの集合の「差(差集合)」とは、1つ目の集合には存在するが、2つ目の集合には存在しない要素だけから構成される集合のことです。set_difference関数によってコピーされる要素は、必ず1つ目の集合から取り出され、元の順序が保たれます。また、この関数を正しく動作させるためには、両方の集合があらかじめソート(整列)されている必要があります。代表的な集合演算には以下のようなものがあります。和集合(Union)積集合(Intersection)対称差(Symmetric Difference / 排他的論理和)差集合(Difference / 減算)アルゴリズムBegin 集合用のvec