合并两个数组中的唯一元素

时间:2014-07-17 12:21:39

标签: c++ ios objective-c c arrays

我有两个数组

array1 = { 2 , 4 , 1 , 5 , 7 , 10 } ;

array2 = { 3 , 1 , 6 , 8 , 9 , 4 };

我的结果数组应该是两个数组中的唯一元素,即

Result = { 2 , 5 , 7 , 10 , 3 , 6 , 8 , 9 };

条件:数组将是未排序的整数值。

2 个答案:

答案 0 :(得分:3)

对数组进行排序,然后对它们进行std::set_symmetric_difference

答案 1 :(得分:0)

这是一种使用标准算法的直接方法

#include <iostream>
#include <algorithm>
#include <iterator>

int main() 
{
    int a1[] = { 2 , 4 , 1 , 5 , 7 , 10 } ;
    int a2[] = { 3 , 1 , 6 , 8 , 9 , 4 };

    for ( int x : a1 ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( int x : a2 ) std::cout << x << ' ';
    std::cout << std::endl;

    size_t n = std::count_if( std::begin( a1 ), std::end( a1 ),
        [&]( int x )
        {
            return
            std::find( std::begin( a2 ), std::end( a2 ), x ) == std::end( a2 );
        });

    n += std::count_if( std::begin( a2 ), std::end( a2 ),
        [&]( int x )
        {
            return
            std::find( std::begin( a1 ), std::end( a1 ), x ) == std::end( a1 );
        });

    int *result = new int[n];
    int *p = result;

    p = std::copy_if( std::begin( a1 ), std::end( a1 ), p,
        [&]( int x )
        {
            return
            std::find( std::begin( a2 ), std::end( a2 ), x ) == std::end( a2 );
        });

    std::copy_if( std::begin( a2 ), std::end( a2 ), p,
        [&]( int x )
        {
            return
            std::find( std::begin( a1 ), std::end( a1 ), x ) == std::end( a1 );
        });

    for ( p = result; p != result + n; ++p ) std::cout << *p << ' ';
    std::cout << std::endl;

    delete [] result;

    return 0;
}

输出

2 4 1 5 7 10 
3 1 6 8 9 4 
2 5 7 10 3 6 8 9 

而不是例如std::begin( a1 )std::end( a1 ),您只需编写a1a1 + 6,其中6是a1的大小。

如果允许您对原始数组进行排序,那么程序可以采用以下方式

#include <iostream>
#include <iterator>
#include <algorithm>

int main() 
{
    int a1[] = { 2 , 4 , 1 , 5 , 7 , 10 } ;
    int a2[] = { 3 , 1 , 6 , 8 , 9 , 4 };

    for ( int x : a1 ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( int x : a2 ) std::cout << x << ' ';
    std::cout << std::endl;

    std::sort( std::begin( a1 ), std::end( a1 ) );
    std::sort( std::begin( a2 ), std::end( a2 ) );

    size_t n = std::count_if( std::begin( a1 ), std::end( a1 ),
        [&]( int x )
        {
            return
            !std::binary_search( std::begin( a2 ), std::end( a2 ), x );
        } );

    n += std::count_if( std::begin( a2 ), std::end( a2 ),
        [&]( int x )
        {
            return
            !std::binary_search( std::begin( a1 ), std::end( a1 ), x );
        } );

    int *result = new int[n];

    std::set_symmetric_difference( std::begin( a1 ), std::end( a1 ),
                                   std::begin( a2 ), std::end( a2 ),
                                   result );

    for ( int *p = result; p != result + n; ++p ) std::cout << *p << ' ';
    std::cout << std::endl;

    delete [] result;

    return 0;
}

输出

2 4 1 5 7 10 
3 1 6 8 9 4 
2 3 5 6 7 8 9 10