C++setの使い方を詳しく説明します。

4373 ワード

C++setの使い方を詳しく説明します。
セットもSTLでよく見られる容器です。セットコンテナは、赤と黒の木のバランスを実現した二叉検索ツリーのデータ構造を実現し、二叉の木の配列を自動的に調整し、元素を適切な位置に配置します。set容器に含まれる要素の値は唯一であり、集合中の要素は一定の順序で並べられている。
セットを作る目的は速く検索するためで、キーの値を直接修正してはいけません。
setのいくつかのよくある操作:
  • begin()は、第1の要素を指すローズマリー
  • を返す。
  • clear()は、すべての要素
  • をクリアする。
  • count()は、ある値要素の個数
  • を返します。
  • empty()セットが空だったら、trueに戻ります。
  • end()は、最後の要素を指した後のローズマリーを返します。最後の要素
  • ではありません。
  • erase()は、セット内の要素
  • を削除する。
  • find()は、検索された要素を指すローズマリー
  • を返す。
  • insert()は、セットに要素
  • を挿入する。
  • max_size()は、セットが収容できる要素の最大制限値
  • を返します。
  • size()セットにおける要素の数
  • swap()は2つのセット変数を交換します。
    実はsetのほとんどの操作はvectorと似ていますが、setはランダムアクセスをサポートしていません。セットは一つの要素を入れると、この元素の位置を調整して、適当な位置に置くので、セットの中に一つのinsert挿入操作しかありません。
    集合にとって、私達は普通に集合、交差、差集、補足などの操作があります。だからsetの操作にも似たような集合操作があります。
    
    
    
    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)
         2T ,     n+1   ,        n(0<=n<=100),        n     。
    
    Output
    
            ,          ,”Case #.NO”,
          7 ,        ,
     2       A、B,  5        A、B  (A u B)、 (A n B)、 (A C 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<iostream> 
    #include<set> 
    #include<algorithm> 
    #include<vector> 
    using namespace std; 
    void print(set<int> a) 
    { 
      if(a.begin() == a.end()) 
          cout << "}" << endl; 
      for(set<int>::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<int> a, b, c; cin >> T; while(T--) { cou++; a.clear(), b.clear(), c.clear(); int n; cin >> n; for(int i=0;i<n;i++) { int x; cin >> x; a.insert(x); } cin >> n; for(int i=0;i<n;i++) { int x; cin >> 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容器
    疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。