とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

std::includes, std::set_union, std::set_difference, std::set_intersection, std::set_symmetric_difference

STL―標準テンプレートライブラリによるC++プログラミング 第2版

// P113 ex05-26.cpp
#include<iostream>
#include<string>
#include<algorithm>
#include<cassert>
int main(){
 using std::cout;
 using std::endl;
 using std::string;
 using std::back_inserter;
 using std::includes; // 部分集合か
 using std::set_union; // 和集合
 using std::set_difference; // 差集合
 using std::set_intersection; // 積集合
 using std::set_symmetric_difference; // 対象差
 const string s1("abcde"), s2("aeiou"); // ソート済み
 cout << "Illustrating the generic set operations." << endl;

 // i, o, u を含まない
 assert(!includes(s1.begin(), s1.end(), s2.begin(), s2.end()));
 // a, e を含む
 assert(includes(s1.begin(), s1.end(), s2.begin(), s2.begin() + 2));

 string setUnion;
 set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
  back_inserter(setUnion));
 assert(setUnion == "abcdeiou");

 string setDifference;
 set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
  back_inserter(setDifference));
 assert(setDifference == "bcd");

 string setIntersection;
 set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
  back_inserter(setIntersection));
 assert(setIntersection == "ae");

 string setSymmetricDifference;
 set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
  back_inserter(setSymmetricDifference));
 assert(setSymmetricDifference == "bcdiou");
 cout << " --- Ok." << endl;
}