首页 > C++数组间合并

C++数组间合并

如何实现C++数组间的合并,存在重复项

描述如下:

比如 a[4] = {2, 3, 454, 67}; b[4] = {223, 23, 45, 454}; c[4] = {23, 87, 223, 452};
合并成merge[num] = {2, 3, 23, 45, 67, 87, 223, 452, 454}; num为9; num的值在合并过程中自动累加统计实现!
怎么把数组合并,各数组复的元素重仅仅保留一个!



#include <set>
#include <iostream>

int main()
{
    int a[4] = {2, 3, 454, 67}; 
    int b[4] = {223, 23, 45, 454}; 
    int c[4] = {23, 87, 223, 452};

    std::set<int> set(a, a+4);
    set.insert(b, b+4);
    set.insert(c, c+4);

    for (auto i : set)
        std::cout << i << " ";
    std::cout << std::endl; 

    return 0;
} 

需要C++11 支持。

如果不想用c++11,只需要改一下输出:

for (std::set<int>::iterator iter = set.begin(); iter != set.end(); ++iter)
    std::cout << *iter << " ";
std::cout << std::endl; 

鉴于题主想用比较底层的方法,类似纯C的方式,即不用STL的函数。那样思路就要分几个步骤了:

  1. 合并到一个大数组里去
  2. 将大数组排序
  3. 去掉大数组中的重复项

我用C语言简单实现了上述步骤,没有考虑算法效率,仅供参考:

#include <stdio.h>
#include <stdlib.h>

int* unique(int* first, int* last)
{
    if (first==last) return last;

    int* result = first;
    while (++first != last)
    {
        if (!(*result == *first)) 
            *(++result)=*first;
    }
    return ++result;
}

void merge(int a[], int b[], int beg, int size)
{
    for (int i=0; i<size; ++i)
        a[beg+i] = b[i];
}

int compare (const void * a, const void * b)
{
    return ( *(int*)a - *(int*)b );
}

int main()
{
    int a[4] = {2, 3, 454, 67}; 
    int b[4] = {223, 23, 45, 454}; 
    int c[4] = {23, 87, 223, 452};

    int d[12];
    merge(d, a, 0, 4);
    merge(d, b, 4, 4);
    merge(d, c, 8, 4);

    qsort (d, 12, sizeof(int), compare);
    int *end = unique(d, d+12);
    for (int *p = d; p != end; ++p)
        printf("%d ", *p);

    return 0;
} 

其中排序,我直接用了快排,题主也可以自行实现排序。

【热门文章】
【热门文章】