STLを使ったC++のvector(ベクトル)実装プログラム
std::vectorは、動的配列のように要素の挿入や削除に応じて自動的にサイズを変更できるコンテナで、メモリ(記憶域)の管理はコンテナ自身が行います。要素は連続したメモリ領域に配置されるため、イテレータを使ったアクセスや走査が可能です。また、先頭・中間・末尾のいずれの位置にもデータを挿入・削除できます。
使用する主な関数とその説明
v.size() : ベクトルのサイズ(現在の要素数)を返します。 v.push_back() : ベクトルの末尾に要素を挿入します。 v.pop_back() : ベクトルの末尾から要素を取り除きます。 v.capacity() : 現在ベクトルに割り当てられている記憶域のサイズを要素数で返します。 v.clear() : ベクトルの全要素を削除します。
サンプルコード
以下は、メニュー形式でベクトルの各操作を試せるC++プログラムです。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
vector<int>::iterator it;
int c, i;
while (1) {
cout<<"1.ベクトルのサイズを表示"<<endl;
cout<<"2.ベクトルに要素を挿入"<<endl;
cout<<"3.ベクトルの末尾の要素を削除"<<endl;
cout<<"4.ベクトルの容量を表示"<<endl;
cout<<"5.イテレータで表示"<<endl;
cout<<"6.ベクトルをクリア"<<endl;
cout<<"7.終了"<<endl;
cout<<"選択してください: ";
cin>>c;
switch(c) {
case 1:
cout<<"ベクトルのサイズ: ";
cout<<v.size()<<endl;
break;
case 2:
cout<<"挿入する値を入力: ";
cin>>i;
v.push_back(i);
break;
case 3:
cout<<"末尾の要素を削除:"<<endl;
v.pop_back();
break;
case 4:
cout<<"ベクトルの容量: ";
cout<<v.capacity()<<endl;
break;
case 5:
cout<<"イテレータによる表示: ";
for (it = v.begin(); it != v.end(); it++) {
cout<<*it<<" ";
}
cout<<endl;
break;
case 6:
v.clear();
cout<<"ベクトルをクリアしました"<<endl;
break;
case 7:
exit(1);
break;
default:
cout<<"無効な選択です"<<endl;
}
}
return 0;
}
実行結果
1.ベクトルのサイズを表示 2.ベクトルに要素を挿入 3.ベクトルの末尾の要素を削除 4.ベクトルの容量を表示 5.イテレータで表示 6.ベクトルをクリア 7.終了 選択してください: 1 ベクトルのサイズ: 0 (以降、メニュー表示は省略します) 選択してください: 2 挿入する値を入力: 7 選択してください: 2 挿入する値を入力: 6 選択してください: 2 挿入する値を入力: 4 選択してください: 2 挿入する値を入力: 3 選択してください: 2 挿入する値を入力: 5 選択してください: 4 ベクトルの容量: 8 選択してください: 5 イテレータによる表示: 7 6 4 3 5 選択してください: 3 末尾の要素を削除: 選択してください: 5 イテレータによる表示: 7 6 4 3 選択してください: 6 ベクトルをクリアしました 選択してください: 7
size()とcapacity()の違い
size()は実際に格納されている要素数を返しますが、capacity()はメモリの再割り当てなしで格納できる最大要素数を返します。上記の実行例では、要素を5つ挿入した時点でcapacityが「8」と表示されています。これは多くの実装で、容量が不足するたびに現在の容量の約2倍のメモリを確保し直す(1→2→4→8と増加)ためです。この仕組みにより、要素を追加するたびにメモリ再割り当てが発生するオーバーヘッドを抑え、効率的な動作を実現しています。
-
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