C++setのいくつかの使い方


setもSTLでは比較的一般的な容器です.set集合コンテナは赤黒ツリーのバランス二叉検索ツリーのデータ構造を実現し,二叉ツリーの配列を自動的に調整し,要素を適切な位置に置く.setコンテナに含まれる要素の値は一意であり,集合中の要素は一定の順序で配列される.
setセットを構築する目的は,キー値を直接変更することなく,迅速な検索のためである.
setの一般的な操作:
begin()は、最初の要素を指す反復器clear()を返します.すべての要素count()が値要素を返す個数empty()をクリアします.集合が空の場合、true(真)end()を返します.最後の要素を指す反復器を返します.最後の要素ではありませんerase()コレクションの要素find()は、検索された要素を指す反復器insert()を返します.コレクションに要素max_を挿入します.size()は、集合が収容できる要素の最大限界値size()集合内の要素の数swap()を返して2つの集合変数を交換する
実際にsetのほとんどの操作はvectorと似ていますが、setはランダムアクセスをサポートしていません.反復器を使用してアクセスする必要があります.setは1つの要素を入れるとこの要素の位置を調整し、適切な位置に置くので、setには1つのinsert挿入操作しかありません.
集合については、通常、並列、交差、差分、補完のいくつかの操作があります.したがって、setの操作にも、includeのヘッダファイルの下にある類似の集合操作があります.
std::set_intersection() :             。
std::set_union() :        
std::set_difference():  
std::set_symmetric_difference():                                     
学校OJには、このいくつかの操作を行うことができる問題があります.次は学校OJの問題です.
Description
集合の演算は,与えられた集合で新しい集合を指定することである.AとBを集合とすると、それらの並列交差補完集合はそれぞれ以下のように定義される.
A∪B={x|x∈A∨x∈B}
A∩B={x|x∈A∧x∈B}
A-B={x|x∈A∧xはB}に属さない
SA={x|x∈(A∪B)∧xはA}に属さない
SB={x|x∈(A∪B)∧xはB}に属さない
Input
最初の行には、Tグループのテストデータが合計であることを示す正の整数Tが入力される.(T<=200)
次に、下に2 T行があり、各行にn+1個の数字があり、そのうち1番目の数字はn(0<=n<=100)であり、その行の後ろにn個の数字入力があることを示す.
Output
各試験データのセットについて、まず試験データのシーケンス番号、「Case#」を出力.NO”,
次に合計7行を出力し、各行が集合し、
最初の2行はそれぞれ集合A,Bを出力し,次の5行はそれぞれ集合A,Bの並(A u B),交(A n B),差(A−B),補を出力する.
コレクション内の要素は「{}」で拡張され、要素間は「,」で区切られます.
Sample Input
14 1 2 3 10
Sample Output
Case# 1:
A = {1, 2, 3}
B = {}
A u B = {1, 2, 3}
A n B = {}
A - B = {1, 2, 3}
SA = {}
SB = {1, 2, 3}
私のコードは次のとおりです.
#include
#include
#include
#include
using namespace std;
void print(set a)
{
    if(a.begin() == a.end())
            cout << "}" << endl;
    for(set::iterator it = a.begin();it!=a.end();it++)
    {
        if(++it==a.end())
        {
            it--;
            cout << *it << "}
"; } else { it--; cout << *it << ", "; } } } int main() { int T, cou = 0; set a, b, c; cin >> T; while(T--) { cou++; a.clear(), b.clear(), c.clear(); int n; cin >> n; for(int i=0;i> x; a.insert(x); } cin >> n; for(int i=0;i> x; b.insert(x); } cout << "Case# " << cou << ":" << endl; cout << "A = {"; print(a); cout << "B = {"; print(b); set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); cout << "A u B = {"; print(c); c.clear(); set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); cout << "A n B = {"; print(c); c.clear(); set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); cout << "A - B = {"; print(c); c.clear(); set_difference(b.begin(),b.end(),a.begin(),a.end(),inserter(c,c.begin())); cout << "SA = {"; print(c); c.clear(); set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin())); cout << "SB = {"; print(c); } return 0; }

Inserterは反復アダプタの挿入反復器です.
原理:その内部呼び出しinsert()機能:コンテナの指定位置に要素制限を挿入する:inset()メンバー関数を提供するコンテナのみinserterが役に立つ.全てのSTL容器はinset()関数を提供する.適用:すべてのSTLコンテナ