日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析 set相关算法

發布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析 set相关算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • ?STL 一共提供了四種與set (集合)相關的算法,分別是并集(union)、交集(intersection) > 差集 (difference)、對稱差集 (symmetricdifference
  • 所謂set,可細分為數學上的定義和STL的定義兩種,數學上的set允許元素重復而未經排序,例 如 { 1,1,4,6,3} , ST L 的定義(也就是set 容器,見 5.3節) 則要求元素不得重復,并且經過排序,例如 {1,3,4,6} 。本節的四個算法所接受的set,必須是有序區間(sorted range), 元素值得重復出現。換句話說,它們可以接受 STL的 set /multiset容器作為輸入區間
  • SGI STL 另外提供有 hash_set / hash_m ultiset 兩種容器,以 hashtable為底層機制(見5.8節、5.10節 ),其內的元素并未呈現排序狀態,所以雖然名稱之中也有set字樣,卻不可以應用于本節的四個算法
#include <iostream> #include <algorithm> #include <iterator> #include <set>template<class T> struct display{void operator()(const T&x){std::cout << x << ' ';} }; int main(int argc,char* argv[]) {int ia1[] = {1,3,5,7,9,11};int ia2[] = {1,1,2,3,5,8,13};std::multiset<int>S1(ia1,ia1+6);std::multiset<int>S2(ia2,ia2+7);std::for_each(S1.begin(),S1.end(),display<int>{});std::cout << "\n";std::for_each(S2.begin(),S2.end(),display<int>{});std::cout << "\n";std::multiset<int>::iterator first1 = S1.begin();std::multiset<int>::iterator last1 = S1.end();std::multiset<int>::iterator first2 = S2.begin();std::multiset<int>::iterator last2 = S2.end();std::cout << "Union of S1 and S2: ";std::set_union(first1,last1,first2,last2,std::ostream_iterator<int>(std::cout," "));std::cout << "\n";first1 = S1.begin();first2 = S2.begin();std::cout << "Intersection of S1 and S2: ";std::set_intersection(first1,last1,first2,last2,std::ostream_iterator<int>(std::cout," "));std::cout << "\n";first1 = S1.begin();first2 = S2.begin();std::cout << "Difference of S1 and S2(S1 - S2): ";std::set_difference(first1,last1,first2,last2,std::ostream_iterator<int>(std::cout," "));std::cout << "\n";first1 = S1.begin();first2 = S2.begin();std::cout << "Symmetric difference of S1 and S2: ";std::set_symmetric_difference(first1,last1,first2,last2,std::ostream_iterator<int>(std::cout," "));std::cout << "\n";return 0; }

6.5.1 set_ union

  • 算 法 set_union可 構 造 S1和S2之并集。也就是說,它能構造出集合SI U S2,此集合內含S1 或 S2內的每一個元素。S1、S2及其并集都是以排序區間表示。返回值為一個迭代器,指向輸出區間的尾端
  • 由 于 S1和 S 2 內的每個元素都不需唯一,因此,如果某個值在S1 出 現 n 次,在 S2出 現 m 次,那么該值在輸出區間中會出現max(m,n)次,其中n 個來自 s1, 其余來自S2;?在 STL set 容器內,m<=1?且 n<=1
  • ?set_union是一種穩定(stable) 操作,意思是輸入區間內的每個元素的相對 順序都不會改變。set_union有兩個版本,差別在于如何定義某個元素小于另一 個元素。第一版本使用operator<進行比較,第二版本采用仿函數comp進行比較。
// 并集,求存在于[first1, last1)或存在于[first2, last2)的所有元素 // 注意,set是一種sorted range<>這是以下算法的前提 // 版本一 template<class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){// 當兩個區間都尚未到達尾端時,執行以下操作…while (first1 != last1 && first2 != last2){// 在兩區間內分別移動迭代器。首先將元素值較小者(假設為A 區)記錄于目標區,// 然后移動A 區迭代器使之前進;同時間之另一個區迭代器不動。然后進行新一次// 的比大小、記錄小值、迭代器移動…直到兩區中有一區到達尾端。如果元素相等,// 取 S1者記錄于目標區,并同時移動兩個迭代器if (*first1 < *first2){*result = *first1;++first1;} else if (*first2 < *first1){*result = *first2;++first2;} else{//*first2 == *first1*result = *first1;++first1;++first2;}++result;// 只要兩區之中有一區到達尾端,就結束上述的while循環// 以下將尚未到達尾端的區間的所有剩余元素拷貝到目的端// 此刻的 [first1, last1)和 [first2 , last2)之中有一個是空白區間return std::copy(first1,first2,std::copy(first2,first2,result));} }

?6.5.2 set_intersection

  • 算 法 set_intersection可 構 造 SI、S 2 之交集。也就是說,它能構造出集 合 SI∩S2,此集合內同時出現于S 1 和 S 2 內的每一個元素。SI. S2及其交集都是以排序區間表示。返回值為一個迭代器,指向輸出區間的尾端。
  • 由 于 S1和 S 2 內的每個元素都不需唯一,因此,如果某個值在S1出 現 n 次,在 S2出 現 m 次,那么該值在輸出區間中會出現min(m,n)次,并且全部來自 S1.在 STL set 容器內,m < 1 且 n <?1
  • set_inter section是一種穩定(stable)操作,意思是輸出區間內的每個元素的相對順序都和S1內的相對順序相同。它有兩個版本,差別在于如何定義某個元素小于另一個元素.第一版本使用operator進行比較,第二版本采用仿函數comp 進行比較。
// 并集,求存在于[first1, last1)且存在于[first2, last2)的所有元素 // 注意,set是一種sorted range 這是以下算法的前提 // 版本一 template<class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){// 當兩個區間都尚未到達尾端時,執行以下操作…while (first1 != last1 && first2 != last2){//在兩區間內分別移動迭代器,直到遇有元素值相同,暫停,將該值記錄于目標區,//再繼續移動迭代器… 直到兩區之中有一區到達尾端if (*first1 < *first2){++first1;} else if (*first2 < *first1){++first2;} else{//*first2 == *first1*result = *first1;++first1;++first2;++result;}return result;} }

?6.5.3 set_difference

  • 算 法 set_difference可構造SI> S 2 之差集。也就是說,它能構造出集合 S1 - S2,此集合內含“出現于S 1 但不出現于S2” 的每一個元素。SI. S2及其交集都是以排序區間表示。返回值為一個迭代器,指向輸出區間的尾端。
  • 由于S1和 S 2 內的每個元素都不需唯一,因此如果某個值在S1 出現n 次, 在 S2出現m 次,那么該值在輸出區間中會出現max(n-m,0)次,并且全部來自S1 . 在 STL set 容器內,m < 1 且 n <?1.
  • set_difference 是一種穩定(stable)操作,意思是輸出區間內的每個元素 的相對順序都和S1內的相對順序相同。它有兩個版本,差別在于如何定義某個元素小于另一個元素。第一版本使用operator進行比較,第二版本采用仿函數comp進行比較。
// 差集,求存在于[first1, last1)且不存在于[first2, last2)的所有元素 // 注意,set是一種sorted range 這是以下算法的前提 // 版本一 template<class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){// 當兩個區間都尚未到達尾端時,執行以下操作…while (first1 != last1 && first2 != last2){// 在兩區間內分別移動迭代器。當第一區間的元素等于第二區間的元素(表示此值// 同時存在于兩區間),就讓兩區間同時前進;當第一區間的元素大于第二區間的元素,// 就讓第二區間前進;有了這兩種處理,就保證當第一區間的元素小于第二區間的// 元素時,第一區間的元素只存在于第一區間中,不存在于第二區間,于是將它// 記錄于目標區if (*first1 < *first2){*result = *first1;++first1;++result;} else if (*first2 < *first1){++first2;} else{//*first2 == *first1++first1;++first2;}return std::copy(first1,last1,result);} }

?6.5.4 set_ symmetric_difference

  • 算 法 set_symmetric_difference可構造 SI.S2之對稱差集。也就是說, 它能構造出集合 (S1-S2) U (S2-S1), 此集合內含"出現于S1但不出現于S2"以及《出現于S2但不出現于S1"的每一個元素。SI、S2及其交集都是以排序區間表示。返回值為一個迭代器,指向輸出區間的尾端.
  • 由于 S1和 S 2 內的每個元素都不需唯一,因此如果某個值在S1出現 n 次, 在 S2 出 現 m 次 ,那么該值在輸出區間中會出現ln-m|次 。如 果 n > m , 輸出 區間內的最后n - m 個 元素將由S 1 復制而來,如 果 n < m 則輸出區間內的最后 m - n 個元素將由S 2 復制而來。在 STL s e t 容器內,m < 1 且 n <?1。?
  • set_ symmetric_difference是 一 種 穩 定 (stable) 操 作 ,意思是輸入區間 內的元素相對順序不會被改變。它有兩個版本,差別在于如何定義某個元素小于另一個元素。第一版本使用 operator< 進行比較,第二版本采用仿函數 comp
// 對稱差集,求存在于[first1, last1)且不存在于[first2, last2)的所有元素 // 以及存在于[first2, last2)且不存在于[first1, last1)的所有元素 // 注意,上述定義只有在“元素值獨一無二”的情況下才成立.如果將set 一般化, // 允許出現重復元素,那么 set-symmetric-difference的定義應該是: // 如果某值在[first1 last1) 出現n次,在 [first2 last2)出現m 次, // 那么它在result range中應該出現abs (n-m)次 // 注意,set是一種sorted range 這是以下算法的前提 // 版本一 template<class InputIterator1,class InputIterator2,class OutputIterator> OutputIterator set_union(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result){// 當兩個區間都尚未到達尾端時,執行以下操作…while (first1 != last1 && first2 != last2){// 在兩區間內分別移動迭代器。當兩區間內的元素相等,就讓兩區同時前進;// 當兩區間內的元素不等,就記錄較小值于目標區,并令較小值所在區間前進if (*first1 < *first2){*result = *first1;++first1;++result;} else if (*first2 < *first1){*result = *first2;++first2;++result;} else{//*first2 == *first1++first1;++first2;}return std::copy(first1,last1,std::copy(first2,last2,result));}

?

?

總結

以上是生活随笔為你收集整理的STL源码剖析 set相关算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品视频99 | 欧美性一级片 | 六月丁香啪啪 | 欧美激情va永久在线播放 | 国产激情图片 | 日日麻批免费视频播放 | 国产乱人 | 福利视频午夜 | 午夜国产一区二区 | 久久久毛片 | 日本免费精品 | 亚洲色图日韩精品 | 欧美xxxx黑人xyx性爽 | 在线不卡 | 欧洲一级黄色片 | 在线你懂的| 久久成人免费网站 | 一级黄色片一级黄色片 | 天堂av电影在线观看 | 国产av剧情一区 | 日本天堂免费a | 日本一品道 | 日本在线播放 | 国产人妻一区二区三区四区五区六 | 欧美性大战xxxxx久久久 | www.xxx日韩| 日日摸天天添天天添破 | 亚洲国产精品天堂 | 欧美在线视频第一页 | 欧美一级一区二区三区 | 抽插丰满内射高潮视频 | 一卡二卡三卡四卡 | 在线成人福利 | 夫妻黄色片 | 日韩视频在线观看一区二区三区 | 偷拍欧美亚洲 | 四虎精品欧美一区二区免费 | 人与拘一级a毛片 | av一区二区三区免费观看 | 亚洲一区在线不卡 | 国产在线久久久 | 国产精品永久免费观看 | 91精品久久人妻一区二区夜夜夜 | 国产资源在线看 | 久久久精品美女 | 国产精品免费一区二区三区在线观看 | 国产在线精品自拍 | 毛茸茸日本熟妇高潮 | 天堂…中文在线最新版在线 | 国产精品7| 成人www视频 | 污黄视频网站 | 在线观看中文 | av2014天堂 | 日日草夜夜草 | 天天看a| 最新国产露脸在线观看 | 草草影院国产第一页 | 中国xxxx性xxxx产国 | 欧美三级特黄 | 欧美日韩高清一区二区三区 | 久久成人国产 | 丝瓜av| 天堂视频网 | 97夜色| 亚洲欧洲日本精品 | 成人在线观看视频网站 | 伊人快播| 久久久久久国产精品三区 | 欧美激情一区二区三区免费观看 | 17c在线观看视频 | 香蕉国产在线观看 | 夜夜草导航 | 探花视频在线免费观看 | 美女扒开内裤让男人桶 | 国产精品自拍av | 97国产成人无码精品久久久 | 青青国产精品视频 | 日本三级韩国三级三级a级中文 | 国产一级在线视频 | 91干干干 | wwww在线观看 | 先锋资源中文字幕 | 男女免费毛片 | www.视频一区 | 国产视频欧美视频 | 国产黄色免费 | www.av天天| 91免费高清在线观看 | 国产欧美一区二区精品性色 | 亚洲激情一区二区 | 一级免费大片 | 大陆熟妇丰满多毛xxxⅹ | 污污视频免费看 | 成人免费视频网站在线看 | 国产不卡视频在线观看 | 男女做爰真人视频直播 | 中国一区二区三区 | 日韩精品久久久久久 |