如何计算两个C ++数组的并集

时间:2017-04-30 17:11:11

标签: c++ arrays

我正在尝试将union(“U”)操作链接到一个数组中两个数组的不同单词,但它不起作用。谁能帮我?谢谢。

这是我的联盟功能:

#define N 19

void CalcularUnion (tConjunto X, tConjunto Y, tConjunto* Z)
{
    int i, j, k;
    strcpy((*Z).Nombre, X.Nombre);
    strcat((*Z).Nombre, "U");
    strcat((*Z).Nombre, Y.Nombre);

    for (i=0; i<N; i++)
    {
        strcpy((*Z).Elementos[i], " ");
    }

    for(i=0; i<N; i++)
    {
        if(strlen(X.Elementos[i]) != 0)
        {
            strcpy((*Z).Elementos[i], X.Elementos[i]);
        }

        else
        {
            break;
        }
    }

    for(j=0; j<N; j++)
    {
        if(strlen(Y.Elementos[j]) != 0)
        {           
            for(k=0; k<N; k++)
            {
                if(strcmp(Y.Elementos[j], X.Elementos[k]) == 0)
                {
                    break;
                }

                else
                {
                    strcpy((*Z).Elementos[i], Y.Elementos[j]);
                }
            }
        }
    }

    ImprimirConjunto(*Z); //To print the result
}

tConjunto X是一个包含以下内容的数组:Andalucia, Catalunia, Canarias tConjunto Y是一个包含以下内容的数组:Extremadura, Asturias tConjunto Z应该是结果。

在这种情况下,结果应该是:tConjunto Z --> Andalucia, Catalunia, Canarias, Extremadura, Asturias.但是程序应该检查第一个数组(X)上的一个单词是否在第二个上并省略它。

任何人都可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

由于您使用的是C ++,我们可以使用std::stringstd::unordered_set。将XY中的每个字符串插入一个集合中。隐式过滤掉重复项。然后枚举集合中的唯一项目并复制到Z结构中。

#include <unordered_set>

std::unordered_set<std::string> items;

// copy all the strings from X and Y into a set
// duplicates will not get inserted into this collection
for (int i = 0; i < N; i++)
{
     std::string str;
     str = X.Elementos[i];
     items.insert(str);
     str = Y.Elementos[i];
     items.insert(str);
}

// copy all the strings back into Z
int j = 0;
for (auto itor = items.begin(); itor != items.end(); itor++)
{
    std::string str = *itor;
    if (!str.empty())
    {
        // copy to your Z structure
        strcpy(Z->Elementos[j], str.c_str());
        j++;
        if (j >= N) // I'm assuming that Elementos has a max capacity of N items, you can change as appropriate
        {
            break; 
        }
    }
}