利用 set_symmetric_difference 求两个 vector 中不同的所有元素

这个问题原本是 C++ 吧里有人问的, 我当时就立刻动手解决了, 结果后来才发现, STL 里已经有了对应的泛型算法了......

看来我对 STL 知道的还是太少, 贴一下我当时完成的方法:

set<int> VecToSet (const vector<int> &vec)
{
    set<int> tmp_set (vec.cbegin (), vec.cend ());
    return move (tmp_set);
}

void EraseSameNum (set<int> &short_set
                   , set<int> &long_set)
{
    for (auto it = short_set.begin ();
         it != short_set.end ();) {
        auto loc = long_set.find (*it);
        if (loc != long_set.end ()) {
            auto loc2 = it;
            ++it;
            short_set.erase (loc2);
            long_set.erase (loc);
        }
        ++it;
    }
}
set<int> GetDiffNums (const vector<int> &lhs_vec
                        , const vector<int> &rhs_vec)
{
    set<int> lhs_set = VecToSet(lhs_vec);
    set<int> rhs_set = VecToSet(rhs_vec);
    if (lhs_set.size () > rhs_set.size ()) {
        EraseSameNum (rhs_set, lhs_set);
    }
    EraseSameNum (rhs_set, lhs_set);
    set<int> diff_set (lhs_set);
    diff_set.insert (rhs_set.begin(), rhs_set.end());
    return move (diff_set);
}

int main()
{
    using int_v = vector<int>;
    int_v v1{1, 2, 4, 6};
    int_v v2{2, 5, 6, 8, 4};
    set<int> iset = GetDiffNums(v1, v2);
}

刚码好的时候自我感觉还是不错的,直到看到了可以用 STl 的泛型算法解决:

int main ()
{
    using int_v = vector<int>;
    int_v vec1{1, 3, 6};
    int_v vec2{2, 3, 8, 3, 7, 6};
    sort (vec1.begin(), vec1.end());
    sort (vec2.begin(), vec2.end());
    set<int> iset;
    set_symmetric_difference (vec1.begin()
                              , vec1.end()
                              , vec2.begin()
                              , vec2.end()
                              , inserter(
                                iset, iset.begin()));
    return 0;
}
时间: 2024-12-28 12:44:49

利用 set_symmetric_difference 求两个 vector 中不同的所有元素的相关文章

12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a&gt;b?a:b, while for

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数. 在网上看到一些网友给出了

数据结构——算法之(032)(求两个串中的第一个最长子串)

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目: 求两个串中的第一个最长子串(神州数码曾经试题).如"abractyeyt","dgdsaeactyey"的最大子串为"actyey". 题目分析: 1.这里仅仅是实现了简单的字符串算法(最大支持字符串长度64),主要是展示算法思想 2.思路是把2个字符串每一个字符的匹配关系,映射到一张二维数组表中,匹配写1,非匹配写0 算法实现

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

利用递归求两个数字的最大公约数。

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //利用递归求两个数字的最大公约数. //公因数,如果一个整数同时是几个整数的约数,则这个整数为它们的"公约数" function getNum(a, b) { va

C语言求两个函数中的较大者的MAX函数

//求两个函数中的较大者的MAX函数 #include <stdio.h> int main(int argc, const char * argv[]) { printf("input two nimbers\n"); int max(int x,int y); int a, b,c; scanf("%d,%d,",&a,&b); c=max(a,b); printf("max=%d\n",c); printf(&q

【c语言】求两个整数中的较大者

// 求两个整数中的较大者 #include <stdio.h> int max( int a, int b ) { int temp; if( a > b ) { temp = a; } else { temp = b; } return temp; } int main() { int a,b; printf("请输入要比较的两个数:\n"); scanf("%d %d",&a,&b); printf("大数是:%d\

利用快速排序求两集合交集

1.主程序 %% 求两个集合快速排序 tic arrayList1 = [49,38,65,97,76,13,27,49,100,67]; arrayList1 = quickSort(arrayList1,1,length(arrayList1)); arrayList2 = [49,34,76,27,23,566,67]; arrayList2 = quickSort(arrayList2,1,length(arrayList2)); %% 求两个集合交集: length_arrayList

C 语言:返回两个数组中第一个相同元素的指针(我用了loop 、goto loop标签)

// //  main.c //  Pointer_search // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. All rights reserved. //  要求:通过指针查找,实现比较两个有序数组中的元素,输出两个数组中的第一个相同的元素值. #include <stdio.h> int *searchSameElement(int *a,int *b,int len1,int len2); int ma

【算法】求两个数组中相同的元素及其个数(C语言、Java实现)

简介: 方法1:(时间复杂度O(n^2)) public void getNum(String arr1, String arr2) { for (int i = 0; i < arr1.length; i++) { for () { } } }