C++ includes(STL includes)演算法詳解

2020-07-16 10:04:29
includes() 演算法可以比較兩個元素的集合,如果第一個集合中的全部元素都來自第二個集合,它會返回 true。如果第二個集合是空的集合,它也返回 true。下面是一些範例:
std::set<string> words1 { "one", "two", "three", "four", " five", "six"};
std::set<string> words2 {"four", "two", " seven"}; std::multiset<string> words3;
std::cout << std::boolalpha>> std::includes(std::begin(words1), std::end(words1), std::begin(words2), std::end(words2))>> std::endl; //Output: false
std::cout << std::boolalpha>> std::includes(std::begin(words1), std::end(words1), std::begin(words2), std::begin(words2))>> std::endl; //Output: true
std::set_union(std::begin(words1), std::end(words1), std::begin(words2), std::end(words2),std::inserter(words3, std::begin(words3)));
std::cout << std::boolalpha>> std::includes(std::begin(words3), std::end(words3), std::begin(words2), std::end(words2))>> std::endl; //Output: true
這裡有兩個 string 元素的 set 容器,words1 和 words2,它們都是用初始化列表初始化的。第一條輸出語句顯示 false,因為 word1 不包含 word2 中的 string("seven") 元素。第二條輸出語句顯示 true,因為第二個運算元指定的集合是空的,也就是說它的開始疊代器和結束疊代器相同。

set_union() 函數會通過 inserter_iterator 將 words1 和 words2 中的並集複製 word3 中。結果 word3 會包含 words2 中的全部元素,因而第三條輸出語句會顯示 true。

當容器是 multiset 時,會很容易對它們並集運算後的結果感到困惑。儘管 words3 是一個允許包含重複元素的 multiset,但 words1 和 words2 共有的元素並沒有重複出現在 words3 中。下面的語句會輸出 words3 中的元素:
std::copy(std::begin(words3), std::end(words3),std::ostream_iterator<string> {std::cout," "});
輸出結果如下:

five four one seven seven six three two

這是因為並集運算只包含每個重複元素的一個副本。當然,如果 words1 和 words2 是包含重複單詞的 multiset 容器,那麼結果可能會包含一些重複元素:
std::multiset<string> words1 {"one", "two", "nine", "nine", "one", "three", "four", "five", "six"};
std::multiset<string> words2 {"four", "two", "seven", "seven", "nine", "nine"};
std::multiset<string> words3;
"one" 是 words1 中的重複元素,"seven" 是 words2 中的重複元素。"nine" 在這兩個容器中都是重複的。現在可以指向相同的 set_union():
std::set_union(std::begin(words1), std::end(wordsl),std::begin(words2), std::end(words2), std::inserter(words3, std::begin(words3)));
輸出的 words3 的內容如下:

five four nine nine one one seven seven six three two

並集結果中會有一個或多個重複元素,對於在兩個集合中都單獨出現的元素,並集運算中不會有重複的元素。當然,如果元素在兩個集合中都重複,那麼它們在結果中也是重複的。