集合

//------------------------------------集合---------------------------------//
/*
题目描述
给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。
输入描述:
每组输入数据分为三行,第一行有两个数字n,m(0 ≤ n,m ≤ 10000),分别表示集合A和集合B的元素个数。后两行分别表示集合A和集合B。每个元素为不超过int范围的整数,每个元素之间有个空格隔开。
输出描述:
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开,行末无空格。

示例1
输入
3 3
1 3 5
2 4 6
输出
1 2 3 4 5 6
*/
/*
    我使用了两种方法
    第一种是标准库的set,用这个比较简单,不用判断数字是否重复,因为set就是不重复,
    并且排序的集合,默认排序为升序,如果遇到相同的数,会直接忽略,不重复的数才放
    入,在stl内部使用红黑树实现的,这是一个平衡二叉树,不做太多说明。
    第二种用的vector,把所有数push_back进去,用算法sort排序后,用unique删除重
    复元素(去除重复元素后,空间还是在那里,需要用erase删除空间)
*/
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
using namespace std;
int f8()
{
    //法1
    int numA, numB;
    cin >> numA >> numB;
    int temp;
    set<int> s;
    for (int i = 0; i < numA; ++i)
    {
        cin >> temp;
        s.insert(temp);
    }
    for (int i = 0; i < numB; ++i)
    {
        cin >> temp;
        s.insert(temp);
    }
    auto ptr = s.cbegin();
    for (int i = 0; i < s.size() - 1; ++i)
    {
        cout << *ptr << " ";
        ++ptr;
    }
    cout << *ptr;
    return 0;
    //法2
    /*
        int numA, numB;
        cin >> numA >> numB;
        vector<int> A, B;
        int temp;
        for(int i = 0; i < numA; ++i)
        {
            cin >> temp;
            A.push_back(temp);
        }
        for(int i = 0; i < numB; ++i)
        {
            cin >> temp;
            B.push_back(temp);
        }
        vector<int> vec(A);
        for(int i = 0; i < B.size(); ++i)
            vec.push_back(B[i]);
        sort(vec.begin(), vec.end());
        auto ptr = unique(vec.begin(), vec.end());
        vec.erase(ptr, vec.end());
        for(int i = 0; i < vec.size() - 1; ++i)
            cout << vec[i] << " ";
        cout << *(vec.cend() - 1);
        return 0;
        */
}

 

posted @ 2017-11-01 19:36  CoderZSL  阅读(288)  评论(0编辑  收藏  举报