STL源码剖析——STL算法之set集合算法

矫情吗;* 2022-08-12 16:27 291阅读 0赞

前言

本节介绍set集合的相关算法,分别是并集set_union,差集set_difference,交集set_intersection
和对称差集set_symmetric_difference,这是个函数都提供了两个版本的函数原型:第一个版本是采用默认的排序比较方式operator<;第二个版本是用户通过仿函数comp自行指定排序方式。注意:这四个算法接受的输入区间都是有序的,输出也是有序的。下面对set算法进行剖析,具体注释详见源码,同时给出例子说明该算法的功能。本文源码摘自SGI STL中的文件。

set算法源码剖析

  1. /*
  2. 下面是计算set集合的相关算法,分别是并集set_union,差集set_difference,交集set_intersection
  3. 和对称差集set_symmetric_difference,这是个函数都提供了两个版本的函数原型
  4. 第一个版本是采用默认的排序比较方式 operator<
  5. 第二个版本是用户通过comp自行指定排序方式
  6. 注意:这四个算法接受的输入区间都是有序的,输出也是有序的
  7. */
  8. // Set algorithms: includes, set_union, set_intersection, set_difference,
  9. // set_symmetric_difference. All of these algorithms have the precondition
  10. // that their input ranges are sorted and the postcondition that their output
  11. // ranges are sorted.
  12. // 判断[first1, last1)是否包含[first2, last2),
  13. // 注意: 两个区间要保证有序,默认排序方式是operator<,若要自行定义排序方式,则调用第二版本;
  14. template <class _InputIter1, class _InputIter2>
  15. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  16. _InputIter2 __first2, _InputIter2 __last2) {
  17. __STL_REQUIRES(_InputIter1, _InputIterator);
  18. __STL_REQUIRES(_InputIter2, _InputIterator);
  19. __STL_REQUIRES_SAME_TYPE(
  20. typename iterator_traits<_InputIter1>::value_type,
  21. typename iterator_traits<_InputIter2>::value_type);
  22. __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  23. _LessThanComparable);
  24. while (__first1 != __last1 && __first2 != __last2)//遍历两个区间
  25. if (*__first2 < *__first1)//first2小于first1表示不包含
  26. return false;//返回FALSE
  27. else if(*__first1 < *__first2)//若first1小于first2
  28. ++__first1;//寻找第一个区间下一个位置
  29. else
  30. ++__first1, ++__first2;//若first2等于first1,遍历两区间的下一位置
  31. return __first2 == __last2;//若第二个区间先到达尾端,则返回TRUE
  32. }
  33. //版本二:用户通过comp自行指定排序方式
  34. template <class _InputIter1, class _InputIter2, class _Compare>
  35. bool includes(_InputIter1 __first1, _InputIter1 __last1,
  36. _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
  37. __STL_REQUIRES(_InputIter1, _InputIterator);
  38. __STL_REQUIRES(_InputIter2, _InputIterator);
  39. __STL_REQUIRES_SAME_TYPE(
  40. typename iterator_traits<_InputIter1>::value_type,
  41. typename iterator_traits<_InputIter2>::value_type);
  42. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  43. typename iterator_traits<_InputIter1>::value_type,
  44. typename iterator_traits<_InputIter2>::value_type);
  45. while (__first1 != __last1 && __first2 != __last2)
  46. if (__comp(*__first2, *__first1))
  47. return false;
  48. else if(__comp(*__first1, *__first2))
  49. ++__first1;
  50. else
  51. ++__first1, ++__first2;
  52. return __first2 == __last2;
  53. }
  54. //两个集合区间的并集,同样也有两个版本
  55. //求存在于[first1, last1)或存在于[first2, last2)内的所有元素
  56. //注意:输入区间必须是已排序
  57. /*
  58. default (1) :默认是operator<操作的排序方式
  59. template <class InputIterator1, class InputIterator2, class OutputIterator>
  60. OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
  61. InputIterator2 first2, InputIterator2 last2,
  62. OutputIterator result);
  63. custom (2) :用户指定的排序方式
  64. template <class InputIterator1, class InputIterator2,
  65. class OutputIterator, class Compare>
  66. OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
  67. InputIterator2 first2, InputIterator2 last2,
  68. OutputIterator result, Compare comp);
  69. */
  70. //版本一:默认是operator<操作的排序方式
  71. template <class _InputIter1, class _InputIter2, class _OutputIter>
  72. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  73. _InputIter2 __first2, _InputIter2 __last2,
  74. _OutputIter __result) {
  75. __STL_REQUIRES(_InputIter1, _InputIterator);
  76. __STL_REQUIRES(_InputIter2, _InputIterator);
  77. __STL_REQUIRES(_OutputIter, _OutputIterator);
  78. __STL_REQUIRES_SAME_TYPE(
  79. typename iterator_traits<_InputIter1>::value_type,
  80. typename iterator_traits<_InputIter2>::value_type);
  81. __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  82. _LessThanComparable);
  83. //两个区间都尚未到达区间尾端,执行以下操作
  84. while (__first1 != __last1 && __first2 != __last2) {
  85. /*
  86. 在两区间内分别移动迭代器,首先将元素较小者(假设为A区)记录在目标区result
  87. 移动A区迭代器使其前进;同时另一个区的迭代器不变。然后进行一次新的比较,
  88. 记录较小值,移动迭代器...直到两区间中有一个到达尾端。若两区间存在元素相等,
  89. 默认记录第一区间的元素到目标区result.
  90. */
  91. if (*__first1 < *__first2) {//first1小于first2
  92. *__result = *__first1;//则result初始值为first1
  93. ++__first1;//继续第一个区间的下一个元素位置
  94. }
  95. else if (*__first2 < *__first1) {//first2小于first1
  96. *__result = *__first2;//第二区间元素值记录到目标区
  97. ++__first2;//移动第二区间的迭代器
  98. }
  99. else {//若两区间存在相等的元素,把第一区间元素记录到目标区
  100. //同时移动两个区间的迭代器
  101. *__result = *__first1;
  102. ++__first1;
  103. ++__first2;
  104. }
  105. ++__result;//更新目标区位置,以备进入下一次记录操作操作
  106. }
  107. /*
  108. 只要两区间之中有一个区间到达尾端,就结束上面的while循环
  109. 以下将尚未到达尾端的区间剩余的元素拷贝到目标区
  110. 此刻,[first1, last1)和[first2, last2)至少有一个是空区间
  111. */
  112. return copy(__first2, __last2, copy(__first1, __last1, __result));
  113. }
  114. //版本二:用户根据仿函数comp指定排序规则
  115. template <class _InputIter1, class _InputIter2, class _OutputIter,
  116. class _Compare>
  117. _OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
  118. _InputIter2 __first2, _InputIter2 __last2,
  119. _OutputIter __result, _Compare __comp) {
  120. __STL_REQUIRES(_InputIter1, _InputIterator);
  121. __STL_REQUIRES(_InputIter2, _InputIterator);
  122. __STL_REQUIRES(_OutputIter, _OutputIterator);
  123. __STL_REQUIRES_SAME_TYPE(
  124. typename iterator_traits<_InputIter1>::value_type,
  125. typename iterator_traits<_InputIter2>::value_type);
  126. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  127. typename iterator_traits<_InputIter1>::value_type,
  128. typename iterator_traits<_InputIter2>::value_type);
  129. while (__first1 != __last1 && __first2 != __last2) {
  130. if (__comp(*__first1, *__first2)) {
  131. *__result = *__first1;
  132. ++__first1;
  133. }
  134. else if (__comp(*__first2, *__first1)) {
  135. *__result = *__first2;
  136. ++__first2;
  137. }
  138. else {
  139. *__result = *__first1;
  140. ++__first1;
  141. ++__first2;
  142. }
  143. ++__result;
  144. }
  145. return copy(__first2, __last2, copy(__first1, __last1, __result));
  146. }
  147. /*例子:
  148. #include <iostream> // std::cout
  149. #include <algorithm> // std::set_union, std::sort
  150. #include <vector> // std::vector
  151. int main () {
  152. int first[] = {5,10,15,20,25};
  153. int second[] = {50,40,30,20,10};
  154. std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
  155. std::vector<int>::iterator it;
  156. std::sort (first,first+5); // 5 10 15 20 25
  157. std::sort (second,second+5); // 10 20 30 40 50
  158. it=std::set_union (first, first+5, second, second+5, v.begin());
  159. // 5 10 15 20 25 30 40 50 0 0
  160. v.resize(it-v.begin()); // 5 10 15 20 25 30 40 50
  161. std::cout << "The union has " << (v.size()) << " elements:\n";
  162. for (it=v.begin(); it!=v.end(); ++it)
  163. std::cout << ' ' << *it;
  164. std::cout << '\n';
  165. return 0;
  166. }
  167. Output:
  168. The union has 8 elements:
  169. 5 10 15 20 25 30 40 50
  170. */
  171. //两个集合区间的交集,同样也有两个版本
  172. //求存在于[first1, last1)且存在于[first2, last2)内的所有元素
  173. //注意:输入区间必须是已排序,输出区间的每个元素的相对排序和第一个区间相对排序相同
  174. /*
  175. default (1) :默认是operator<操作的排序方式
  176. template <class InputIterator1, class InputIterator2, class OutputIterator>
  177. OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
  178. InputIterator2 first2, InputIterator2 last2,
  179. OutputIterator result);
  180. custom (2) :用户指定的排序方式
  181. template <class InputIterator1, class InputIterator2,
  182. class OutputIterator, class Compare>
  183. OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
  184. InputIterator2 first2, InputIterator2 last2,
  185. OutputIterator result, Compare comp);
  186. */
  187. //版本一:默认是operator<操作的排序方式
  188. template <class _InputIter1, class _InputIter2, class _OutputIter>
  189. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  190. _InputIter2 __first2, _InputIter2 __last2,
  191. _OutputIter __result) {
  192. __STL_REQUIRES(_InputIter1, _InputIterator);
  193. __STL_REQUIRES(_InputIter2, _InputIterator);
  194. __STL_REQUIRES(_OutputIter, _OutputIterator);
  195. __STL_REQUIRES_SAME_TYPE(
  196. typename iterator_traits<_InputIter1>::value_type,
  197. typename iterator_traits<_InputIter2>::value_type);
  198. __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  199. _LessThanComparable);
  200. //若两个区间都尚未到达尾端,则执行以下操作
  201. while (__first1 != __last1 && __first2 != __last2)
  202. //在两个区间分别移动迭代器,直到遇到相等元素,记录到目标区
  203. //继续移动迭代器...直到两区间之中有到达尾端
  204. if (*__first1 < *__first2) //第一个区间元素小于第二区间元素
  205. ++__first1;//移动第一区间的迭代器,此时第二区间的迭代器不变
  206. else if (*__first2 < *__first1) //第二区间的元素小于第一区间元素
  207. ++__first2;//移动第二区间元素,此时第一区间的迭代器不变
  208. else {//若第一区间元素等于第二区间元素
  209. *__result = *__first1;//按第一区间的相对排序记录到目标区
  210. //分别移动两区间的迭代器
  211. ++__first1;
  212. ++__first2;
  213. //更新目标区迭代器,以便继续记录元素
  214. ++__result;
  215. }
  216. //若有区间到达尾部,则停止while循环
  217. //此时,返回目标区
  218. return __result;
  219. }
  220. //版本二:用户根据仿函数comp指定排序规则
  221. template <class _InputIter1, class _InputIter2, class _OutputIter,
  222. class _Compare>
  223. _OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
  224. _InputIter2 __first2, _InputIter2 __last2,
  225. _OutputIter __result, _Compare __comp) {
  226. __STL_REQUIRES(_InputIter1, _InputIterator);
  227. __STL_REQUIRES(_InputIter2, _InputIterator);
  228. __STL_REQUIRES(_OutputIter, _OutputIterator);
  229. __STL_REQUIRES_SAME_TYPE(
  230. typename iterator_traits<_InputIter1>::value_type,
  231. typename iterator_traits<_InputIter2>::value_type);
  232. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  233. typename iterator_traits<_InputIter1>::value_type,
  234. typename iterator_traits<_InputIter2>::value_type);
  235. while (__first1 != __last1 && __first2 != __last2)
  236. if (__comp(*__first1, *__first2))
  237. ++__first1;
  238. else if (__comp(*__first2, *__first1))
  239. ++__first2;
  240. else {
  241. *__result = *__first1;
  242. ++__first1;
  243. ++__first2;
  244. ++__result;
  245. }
  246. return __result;
  247. }
  248. /*例子:
  249. #include <iostream> // std::cout
  250. #include <algorithm> // std::set_intersection, std::sort
  251. #include <vector> // std::vector
  252. int main () {
  253. int first[] = {5,10,15,20,25};
  254. int second[] = {50,40,30,20,10};
  255. std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
  256. std::vector<int>::iterator it;
  257. std::sort (first,first+5); // 5 10 15 20 25
  258. std::sort (second,second+5); // 10 20 30 40 50
  259. it=std::set_intersection (first, first+5, second, second+5, v.begin());
  260. // 10 20 0 0 0 0 0 0 0 0
  261. v.resize(it-v.begin()); // 10 20
  262. std::cout << "The intersection has " << (v.size()) << " elements:\n";
  263. for (it=v.begin(); it!=v.end(); ++it)
  264. std::cout << ' ' << *it;
  265. std::cout << '\n';
  266. return 0;
  267. }
  268. Output:
  269. The intersection has 2 elements:
  270. 10 20
  271. */
  272. //两个集合区间的差集,同样也有两个版本
  273. //求存在于[first1, last1)但不存在于[first2, last2)内的所有元素
  274. //注意:输入区间必须是已排序,输出区间的每个元素的相对排序和第一个区间相对排序相同
  275. /*
  276. default (1) :默认是operator<操作的排序方式
  277. template <class InputIterator1, class InputIterator2, class OutputIterator>
  278. OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
  279. InputIterator2 first2, InputIterator2 last2,
  280. OutputIterator result);
  281. custom (2) :用户指定的排序方式
  282. template <class InputIterator1, class InputIterator2,
  283. class OutputIterator, class Compare>
  284. OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
  285. InputIterator2 first2, InputIterator2 last2,
  286. OutputIterator result, Compare comp);
  287. */
  288. //版本一:默认是operator<操作的排序方式
  289. template <class _InputIter1, class _InputIter2, class _OutputIter>
  290. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  291. _InputIter2 __first2, _InputIter2 __last2,
  292. _OutputIter __result) {
  293. __STL_REQUIRES(_InputIter1, _InputIterator);
  294. __STL_REQUIRES(_InputIter2, _InputIterator);
  295. __STL_REQUIRES(_OutputIter, _OutputIterator);
  296. __STL_REQUIRES_SAME_TYPE(
  297. typename iterator_traits<_InputIter1>::value_type,
  298. typename iterator_traits<_InputIter2>::value_type);
  299. __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  300. _LessThanComparable);
  301. //若两个区间都尚未到达尾端,则执行以下操作
  302. while (__first1 != __last1 && __first2 != __last2)
  303. /*
  304. 在两个区间分别移动迭代器,当第一区间元素等于第二区间元素时,表示两区间共同存在该元素
  305. 则同时移动迭代器;
  306. 当第一区间元素大于第二区间元素时,就让第二区间迭代器前进;
  307. 第一区间元素小于第二区间元素时,把第一区间元素记录到目标区
  308. 继续移动迭代器...直到两区间之中有到达尾端
  309. */
  310. if (*__first1 < *__first2) {//第一区间元素小于第二区间元素
  311. *__result = *__first1;//把第一区间元素记录到目标区
  312. ++__first1;//移动第一区间迭代器
  313. ++__result;//跟新目标区,以便继续记录数据
  314. }
  315. else if (*__first2 < *__first1)//当第一区间的元素大于第二区间的元素
  316. ++__first2;//移动第二区间迭代器,注意:这里不记录任何元素
  317. else {//若两区间的元素相等时,同时移动两区间的迭代器
  318. ++__first1;
  319. ++__first2;
  320. }
  321. //若第二区间先到达尾端,则把第一区间剩余的元素复制到目标区
  322. return copy(__first1, __last1, __result);
  323. }
  324. //版本二:用户根据仿函数comp指定排序规则
  325. template <class _InputIter1, class _InputIter2, class _OutputIter,
  326. class _Compare>
  327. _OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
  328. _InputIter2 __first2, _InputIter2 __last2,
  329. _OutputIter __result, _Compare __comp) {
  330. __STL_REQUIRES(_InputIter1, _InputIterator);
  331. __STL_REQUIRES(_InputIter2, _InputIterator);
  332. __STL_REQUIRES(_OutputIter, _OutputIterator);
  333. __STL_REQUIRES_SAME_TYPE(
  334. typename iterator_traits<_InputIter1>::value_type,
  335. typename iterator_traits<_InputIter2>::value_type);
  336. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  337. typename iterator_traits<_InputIter1>::value_type,
  338. typename iterator_traits<_InputIter2>::value_type);
  339. while (__first1 != __last1 && __first2 != __last2)
  340. if (__comp(*__first1, *__first2)) {
  341. *__result = *__first1;
  342. ++__first1;
  343. ++__result;
  344. }
  345. else if (__comp(*__first2, *__first1))
  346. ++__first2;
  347. else {
  348. ++__first1;
  349. ++__first2;
  350. }
  351. return copy(__first1, __last1, __result);
  352. }
  353. /*例子:
  354. #include <iostream> // std::cout
  355. #include <algorithm> // std::set_difference, std::sort
  356. #include <vector> // std::vector
  357. int main () {
  358. int first[] = {5,10,15,20,25};
  359. int second[] = {50,40,30,20,10};
  360. std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
  361. std::vector<int>::iterator it;
  362. std::sort (first,first+5); // 5 10 15 20 25
  363. std::sort (second,second+5); // 10 20 30 40 50
  364. it=std::set_difference (first, first+5, second, second+5, v.begin());
  365. // 5 15 25 0 0 0 0 0 0 0
  366. v.resize(it-v.begin()); // 5 15 25
  367. std::cout << "The difference has " << (v.size()) << " elements:\n";
  368. for (it=v.begin(); it!=v.end(); ++it)
  369. std::cout << ' ' << *it;
  370. std::cout << '\n';
  371. return 0;
  372. }
  373. Output:
  374. The difference has 3 elements:
  375. 5 15 25
  376. */
  377. //两个集合区间的对称差集,同样也有两个版本
  378. //求存在于[first1, last1)但不存在于[first2, last2)内的所有元素以及出现在[first2, last2)但不出现在[first1, last1)
  379. //注意:输入区间必须是已排序
  380. /*
  381. default (1) :默认是operator<操作的排序方式
  382. template <class InputIterator1, class InputIterator2, class OutputIterator>
  383. OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1,
  384. InputIterator2 first2, InputIterator2 last2,
  385. OutputIterator result);
  386. custom (2) :用户指定的排序方式
  387. template <class InputIterator1, class InputIterator2,
  388. class OutputIterator, class Compare>
  389. OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1,
  390. InputIterator2 first2, InputIterator2 last2,
  391. OutputIterator result, Compare comp);
  392. */
  393. //版本一:默认是operator<操作的排序方式
  394. template <class _InputIter1, class _InputIter2, class _OutputIter>
  395. _OutputIter
  396. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  397. _InputIter2 __first2, _InputIter2 __last2,
  398. _OutputIter __result) {
  399. __STL_REQUIRES(_InputIter1, _InputIterator);
  400. __STL_REQUIRES(_InputIter2, _InputIterator);
  401. __STL_REQUIRES(_OutputIter, _OutputIterator);
  402. __STL_REQUIRES_SAME_TYPE(
  403. typename iterator_traits<_InputIter1>::value_type,
  404. typename iterator_traits<_InputIter2>::value_type);
  405. __STL_REQUIRES(typename iterator_traits<_InputIter1>::value_type,
  406. _LessThanComparable);
  407. //若两个区间都尚未到达尾端,则执行下面的操作
  408. while (__first1 != __last1 && __first2 != __last2)
  409. /*
  410. 情况1:若两区间元素相等,则同时移动两区间的迭代器.
  411. 情况2:若第一区间的元素小于第二区间元素,则把第一区间元素记录到目标区,且移动第一区间迭代器.
  412. 情况3:若第一区间的元素大于第二区间元素,则把第二区间元素记录到目标区,且移动第二区间迭代器.
  413. */
  414. if (*__first1 < *__first2) {//属于情况2
  415. *__result = *__first1;//把第一区间元素记录到目标区
  416. ++__first1;//移动第一区间迭代器.此时第二区间迭代器不变
  417. ++__result;
  418. }
  419. else if (*__first2 < *__first1) {//属于情况3
  420. *__result = *__first2;//把第二区间元素记录到目标区
  421. ++__first2;//移动第二区间迭代器.此时第一区间迭代器不变
  422. ++__result;
  423. }
  424. else {//属于情况1
  425. //同时移动两区间的迭代器
  426. ++__first1;
  427. ++__first2;
  428. }
  429. /*
  430. 只要两区间之中有一个区间到达尾端,就结束上面的while循环
  431. 以下将尚未到达尾端的区间剩余的元素拷贝到目标区
  432. 此刻,[first1, last1)和[first2, last2)至少有一个是空区间
  433. */
  434. return copy(__first2, __last2, copy(__first1, __last1, __result));
  435. }
  436. //版本二:用户根据仿函数comp指定排序规则
  437. template <class _InputIter1, class _InputIter2, class _OutputIter,
  438. class _Compare>
  439. _OutputIter
  440. set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
  441. _InputIter2 __first2, _InputIter2 __last2,
  442. _OutputIter __result,
  443. _Compare __comp) {
  444. __STL_REQUIRES(_InputIter1, _InputIterator);
  445. __STL_REQUIRES(_InputIter2, _InputIterator);
  446. __STL_REQUIRES(_OutputIter, _OutputIterator);
  447. __STL_REQUIRES_SAME_TYPE(
  448. typename iterator_traits<_InputIter1>::value_type,
  449. typename iterator_traits<_InputIter2>::value_type);
  450. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  451. typename iterator_traits<_InputIter1>::value_type,
  452. typename iterator_traits<_InputIter2>::value_type);
  453. while (__first1 != __last1 && __first2 != __last2)
  454. if (__comp(*__first1, *__first2)) {
  455. *__result = *__first1;
  456. ++__first1;
  457. ++__result;
  458. }
  459. else if (__comp(*__first2, *__first1)) {
  460. *__result = *__first2;
  461. ++__first2;
  462. ++__result;
  463. }
  464. else {
  465. ++__first1;
  466. ++__first2;
  467. }
  468. return copy(__first2, __last2, copy(__first1, __last1, __result));
  469. }
  470. /*例子:
  471. #include <iostream> // std::cout
  472. #include <algorithm> // std::set_symmetric_difference, std::sort
  473. #include <vector> // std::vector
  474. int main () {
  475. int first[] = {5,10,15,20,25};
  476. int second[] = {50,40,30,20,10};
  477. std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
  478. std::vector<int>::iterator it;
  479. std::sort (first,first+5); // 5 10 15 20 25
  480. std::sort (second,second+5); // 10 20 30 40 50
  481. it=std::set_symmetric_difference (first, first+5, second, second+5, v.begin());
  482. // 5 15 25 30 40 50 0 0 0 0
  483. v.resize(it-v.begin()); // 5 15 25 30 40 50
  484. std::cout << "The symmetric difference has " << (v.size()) << " elements:\n";
  485. for (it=v.begin(); it!=v.end(); ++it)
  486. std::cout << ' ' << *it;
  487. std::cout << '\n';
  488. return 0;
  489. }
  490. Output:
  491. The symmetric difference has 6 elements:
  492. 5 15 25 30 40 50
  493. */

参考资料:

《STL源码剖析》侯捷

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 STL剖析】Sort算法

    前言:sort算法必须拿出来单独将,因为它是STL所有算法中最复杂最庞大的一个,就像我肯定会把copy算法单独列出来一样,这两个算法太重要了。 提示:STL算法特点是,前两个