18.6【STL常用集合算法set_intersection、set_union、set_difference】
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 #include<vector> 5 #include<algorithm> 6 7 8 /* 9 5.6 常用集合算法 10 11 5.6.1 set_intersection 12 13 求两个容器的交集 14 set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); 15 // 求两个集合的交集 16 // 注意:两个集合必须是有序序列 17 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // 18 dest 目标容器开始迭代器 19 20 5.6.2 set_union 21 22 求两个集合的并集 23 set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); 24 // 求两个集合的并集 25 // 注意:两个集合必须是有序序列 26 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // 27 dest 目标容器开始迭代器 28 29 5.6.3 set_difference 30 31 求两个集合的差集 32 set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest); 33 // 求两个集合的差集 34 // 注意:两个集合必须是有序序列 35 // beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 // 36 dest 目标容器开始迭代器 37 */ 38 39 40 void myprint(int val) 41 { 42 cout << val << " "; 43 } 44 45 46 void test561() 47 { 48 vector<int> v1; 49 vector<int> v2; 50 for(int i=0; i<10; i++) 51 { 52 v1.push_back(i); 53 v2.push_back(i+5); 54 } 55 56 vector<int> v_tar; 57 //极端情况:大容器包含小容器,开辟空间时取小容器size即可 58 v_tar.resize(min(v1.size(), v2.size())); //min()需要头文件<algorithm> 59 60 vector<int>::iterator pos_end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin()); //返回v_tar实际元素结束位置 61 62 //for_each(v_tar.begin(), v_tar.end(), myprint); //全部元素:5 6 7 8 9 0 0 0 0 0 63 for_each(v_tar.begin(), pos_end, myprint); //实际元素:5 6 7 8 9 64 cout << endl; 65 } 66 67 68 void test562() 69 { 70 vector<int> v1; 71 vector<int> v2; 72 for(int i=0; i<10; i++) 73 { 74 v1.push_back(i); 75 v2.push_back(i+5); 76 } 77 78 vector<int> v_tar; 79 //极端情况:大容器跟小容器没有一点交集,开辟空间时取两容器size之和即可 80 v_tar.resize(v1.size() + v2.size()); 81 82 vector<int>::iterator pos_end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin()); 83 84 for_each(v_tar.begin(), pos_end, myprint); 85 cout << endl; 86 } 87 88 89 void test563() 90 { 91 /* 92 V1={0~9} 93 V2={5~14} 94 95 V1和V2的差集={0 1 2 3 4} V1中非V2的元素 96 V2和V1的差集={10 11 12 13 14} V2中非V1的元素 97 */ 98 99 vector<int> v1; 100 vector<int> v2; 101 for(int i=0; i<10; i++) 102 { 103 v1.push_back(i); 104 v2.push_back(i+5); 105 } 106 107 vector<int> v_tar; 108 //极端情况:大容器跟小容器没有一点交集,开辟空间时取两容器较大者size即可 109 v_tar.resize(max(v1.size(), v2.size())); 110 111 cout << "v1和v2的差集:" << endl; 112 vector<int>::iterator pos_end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v_tar.begin()); 113 for_each(v_tar.begin(), pos_end, myprint); 114 cout << endl; 115 116 cout << "v2和v1的差集:" << endl; 117 pos_end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v_tar.begin()); 118 for_each(v_tar.begin(), pos_end, myprint); 119 cout << endl; 120 } 121 122 123 int main() 124 { 125 test561(); 126 test562(); 127 test563(); 128 /* 129 总结: 130 131 求交集的两个集合必须的有序序列 132 目标容器开辟空间需要从两个容器中取小值 133 set_intersection返回值既是交集中最后一个元素的位置 134 135 求并集的两个集合必须的有序序列 136 目标容器开辟空间需要两个容器相加 137 set_union返回值既是并集中最后一个元素的位置 138 139 求差集的两个集合必须的有序序列 140 目标容器开辟空间需要从两个容器取较大值 141 set_difference返回值既是差集中最后一个元素的位置 142 */ 143 144 system("pause"); 145 return 0; 146 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!