2013年12月23日 星期一

[STL] 關聯式收納器associative container - set 範例

STL 提供四種associative container : set、 mutiset、map、mutimap。

其中最簡單的set 特性:
1.值的型態與key的型態相同,且key是唯一,就是任何特定值只能儲存一個。
  ex. 可以{1,2,3} 但不能 {1,1,2,3}

2.可反轉、會自動排序。

下面的例子用到了 :
include <algorithm>
set_union :  即兩個集合取聯集
set_intersection : 取交集
set_drfference : 交差集,就是你有我沒有,跟我有你沒有的

成員函數 :
insert() :
lower_bound :  找區間用的
upper_bound :

並利用copy() 來輸出至螢幕以及複製新的空集合。
直接看範例 :

  1. #include <iostream>
  2. #include <string>
  3. #include <set>
  4. #include <algorithm>
  5. #include <iterator>
  6. using namespace std;
  7. void show(const char c)
  8. {
  9.     cout << c << " ";
  10. }
  11. int main()
  12. {
  13.     const int N =6;
  14.     string s1[N] = {"buffon""thinkers""for""heavy""can""for" };
  15.     string s2[N] = {"metal""any""food""elegant""deliver""for"};
  16.     set<string> A(s1, s1+N);  //設定A集合範圍從s1 到 s1+N的前一位
  17.     set<string> B(s2, s2+N);
  18.     //設定輸出串流的迭代器,轉接器(adapter)。
  19.     ostream_iterator<string, char> out(cout" ");
  20.     cout << "Set A: ";
  21.     copy(A.begin(), A.end(), out);
  22.     cout << endl;
  23.     cout << "Set B: ";
  24.     copy(B.begin(), B.end(), out);
  25.     cout << endl << endl;
  26.     //union 聯集
  27.     cout << "Union of A & B:\n";
  28.     set_union(A.begin(), A.end(), B.begin(), B.end(), out);
  29.     cout << endl << endl;
  30.     //intersection 交集
  31.     cout << "Intersection of A & B:\n";
  32.     set_intersection(A.begin(), A.end(), B.begin(), B.end(), out);
  33.     cout << endl << endl;
  34.     //Difference 差集
  35.     cout << "Difference of A & B:\n";
  36.     set_difference(A.begin(), A.end(), B.begin(), B.end(), out);
  37.     cout << endl << endl;
  38.     //設定空集合C,將A,B倒入並取聯集
  39.     set<string> C;
  40.     cout << "Set C:\n";
  41.     set_union(A.begin(), A.end(), B.begin(), B.end(),
  42.         insert_iterator<set<string> >(C, C.begin()));
  43.     copy(C.begin(), C.end(), out);
  44.     cout << endl << endl;
  45.     //c.insert() 插入字串, set會自動排序
  46.     string s3("grungy");
  47.     C.insert(s3);
  48.     cout << "Set C after insertion:\n";
  49.     copy(C.begin(), C.end(), out);
  50.     cout << endl << endl;
  51.     //利用lower_bound upper_bound 表示這些範圍內的資料
  52.     //會呈現比ghost之後,spook之前的文字
  53.     cout << "Showing a range:\n";
  54.     copy(C.lower_bound("ghost"), C.upper_bound("spook"), out);
  55.     cout << endl << endl;
  56.     return 0;
  57. }

參考來源: c++ primer plus

沒有留言:

張貼留言