【C++ STL】setのoperator=(代入演算子)の使い方を徹底解説
C++ STLのsetコンテナにおけるoperator=は、あるsetの中身を別のsetへコピー(またはムーブ)するために使用される代入演算子です。通常の「=」による代入と同じ感覚で利用でき、この関数には以下の3つのオーバーロードされた形式が用意されています。
1. コピー版:set& operator=(const set& s1)
set s1 のすべての要素を、呼び出し元の別のsetへコピーします。引数には同じ型のsetを渡します。
使用例: set s1 = s2;
2. ムーブ版:set& operator=(set&& s1)
set s1 の要素を、呼び出し元のsetへ移動(ムーブ)します。コピーと異なり元のsetから要素が奪われるため、大きなデータを扱う場合に効率的です。
3. 初期化子リスト版:set& operator=(initializer_list<value_type> ilist)
初期化子リスト ilist の値を、呼び出し元のsetへコピーします。
使用例: set<int> s1 = { 1, 2, 3, 4, 5 };
注意: いずれの形式も、戻り値として set<T> 型の this ポインタへの参照を返します。これにより、s1 = s2 = s3; のような連続した代入(チェーン代入)も可能になっています。
サンプルプログラム
次のプログラムは、setに対するoperator=の実際の使い方を示したものです。
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> set1, set2;
// 初期化子リストによる初期化
set1 = { 1, 2, 3, 4, 5 };
set2 = { 10, 11, 12, 13 };
// コピー前の状態を表示
cout << "set1 :";
for (auto s = set1.begin(); s != set1.end(); ++s) {
cout << *s << " ";
}
cout << endl;
cout << "set2 :";
for (auto s = set2.begin(); s != set2.end(); ++s) {
cout << *s << " ";
}
// set1 に set2 をコピーした後の状態を表示
cout << endl << "After Copy" << endl;
cout << "set1 :";
set1 = set2;
for (auto s = set1.begin(); s != set1.end(); ++s) {
cout << *s << " ";
}
return 0;
}
実行結果
set1 :1 2 3 4 5 set2 :10 11 12 13 After Copy set1 :10 11 12 13
このように、set1 = set2; を実行すると、set2 のすべての要素が set1 へコピーされ、set1 の元の内容は置き換えられます。setは自動的に要素をソートして重複を排除するため、コピー後も昇順に整列された状態が保たれる点にも注目してください。
-
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