我正在尝试将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)上的一个单词是否在第二个上并省略它。
任何人都可以帮助我吗? 谢谢!
答案 0 :(得分:1)
由于您使用的是C ++,我们可以使用std::string
和std::unordered_set
。将X
和Y
中的每个字符串插入一个集合中。隐式过滤掉重复项。然后枚举集合中的唯一项目并复制到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;
}
}
}