c++ set_difference(STL set_difference)演算法詳解

2020-07-16 10:04:28
set_difference() 演算法可以建立兩個集合的差集,它也有兩個版本的函數並且引數集和 set_union() 相同。下面是一個對降序 set 容器使用這個演算法的範例:
std::set<string, std::greater<string>> words1 {"one", "two", "three", "four", "five", "six" };
std::set<string, std::greater<string>> words2 { "four", "five", "six", "seven", "eight", "nine"};
std::set<string, std::greater<string>> result;
std::set_difference(std::begin(words1) , std::end(words1),
std::begin(words2), std::end(words2), std::inserter(result, std::begin(result)),std::greater<string>());
// Result: "two", "three", "one"
這裡呼叫的這個版本的函數的第 6 個引數是一個用來比較元素的函數物件,因為來自 set 容器的這段元素也用這個函數排序。通過從 words 集合中移除 word1 和 word2 共有的元素來獲取差集,差集由來自 word1 的元素組成。結果得到 words1 的前三個元素的降序序列。這個演算法也會返回一個疊代器,它指向目的容器被插入的最後一個元素的下一個位置。

set_symmetric_difference()演算法

set_symmetric_difference() 演算法和先前的集合演算法遵循同一種模式。下面的幾條語句展示了它的用法:
std::set<string> words1 { "one", "two", "three", "four", "five", "six" };
std::set<string> words2 {"four", "five", "six", "seven", "eight", "nine"};
std::set_symmetric_difference(std::begin(words1), std::end(words1),std::begin(words2), std::end(words2),std::ostream_iterator<string> {std::cout," "});
這個範圍內的元素預設是升序排列的。集合的對稱差集中的元素是兩個集合中不包括它們共有元素的元素。最後一個函數的引數定義了結果集的存放位置,它是一個 ostream_iterator,因此這些元素會被寫入 cout,輸出內容如下:

eight nine one seven three two

自然地,這些序列中的 string 元素都是對它們使用 < 運算子後得到的結果,因為預設的比較函數物件型別是 less<string>。