使用数组时set_union问题

时间:2015-05-04 18:05:41

标签: c++ stl set-union

我试图使用set_union获得4个数组的联合。这是我到目前为止的代码:

int setA[5] = {2, 4, 5, 7, 8};
int setB[7] = {1, 2, 3, 4, 5, 6, 7};
int setC[5] = {2, 5, 8, 8, 15};
int setD[6] = {1, 4, 4, 6, 7, 12};

int AunionB[12];
int CunionD[11];
int finalUnion[23];

int *lastAunionB;
int *lastCunionD;

ostream_iterator<int> screen(cout, " ");

lastAunionB = set_union(setA, setA+5, setB, setB+7, AunionB);

cout << "AunionB = ";
copy(AunionB, lastAunionB, screen);
cout << endl;

lastCunionD = set_union(setC, setC+5, setD, setD+6, CunionD);

cout << "CunionD = ";
copy(CunionD, lastCunionD, screen);
cout << endl;

set_union(AunionB, AunionB+12, CunionD, CunionD+11, finalUnion);

cout << "Final Union = ";
copy(finalUnion, finalUnion+23, screen);
cout << endl;

当我运行代码时,我得到以下输出:

AunionB = 1 2 3 4 5 6 7 8 
CunionD = 1 2 4 4 5 6 7 8 8 12 15 
Final Union = 1 2 3 4 5 6 7 2 4 4 5 6 7 8 8 12 15 52187240 1 1863041424 32767 0 0 

因此,setA and setB的联合与setC and setD的联合一样有效。但是,当我试图获得所有套装的联合时,它不起作用!我猜测finalUnion的最后5个值是地址字段但是如何删除它们?此外,工会本身是不正确的,我无法理解为什么。

2 个答案:

答案 0 :(得分:1)

Union操作会删除两个集合共有的值。

请注意,AUnionB有8个元素(不是代码预测的12个元素)。

您需要调整union-of-union代码以考虑两个初始联合的实际大小。你已准备好做好一切准备:

int *lastFinalUnion = set_union(AunionB, lastAunionB, CunionD, lastCunionD, finalUnion);

请注意,集合C有两个不同的出现次数8,集合D有两个不同的出现次数4,这就是它们在中间结果中出现重复的原因。

<强>更新

  

另外,我尝试了你的代码,我得到了答案为1 2 3 4 5 6 7 2 4 4 5 6 7 8 8 12 15。答案不应该是1 2 3 4 4 5 6 7 8 8 12 15

我相信你是对的,但是我不是在C ++编译器前面一步一步看看正在做什么,或者验证你的输出。实际的代码是由另一个SO成员编辑的,但它对我来说是正确的。

  

在最简单的情况下,set_union从set theory执行“union”操作:输出范围包含[first1,last1],[first2,last2]或两者中包含的每个元素的副本。一般情况更复杂,因为输入范围可能包含重复元素。一般化是如果一个值在[first1,last1]中出现m次并且在[first2,last2]中出现n次(其中m或n可能为零),则它在输出范围中出现max(m,n)次。

https://www.sgi.com/tech/stl/set_union.html

答案 1 :(得分:1)

AunionB和Cuniond的大小不是12和11,因为:

  

第二个范围中具有第一个范围内的等效元素的元素不会复制到结果范围。

试试这段代码:

int setA[5] = { 2, 4, 5, 7, 8 };
int setB[7] = { 1, 2, 3, 4, 5, 6, 7 };
int setC[5] = { 2, 5, 8, 8, 15 };
int setD[6] = { 1, 4, 4, 6, 7, 12 };

int AunionB[12];
int CunionD[11];
int finalUnion[23];

int *lastAunionB;
int *lastCunionD;

ostream_iterator<int> screen(cout, " ");

lastAunionB = set_union(setA, setA + 5, setB, setB + 7, AunionB);

cout << "AunionB = ";
copy(AunionB, lastAunionB, screen);
cout << endl;

lastCunionD = set_union(setC, setC + 5, setD, setD + 6, CunionD);

cout << "CunionD = ";
copy(CunionD, lastCunionD, screen);
cout << endl;

int *finalUnionEnd;
finalUnionEnd = set_union(AunionB, lastAunionB, CunionD, lastCunionD, finalUnion);

cout << "Final Union = ";
copy(finalUnion, finalUnionEnd, screen);
cout << endl;

然后你得到了正确的结果:

Final Union = 1 2 3 4 4 5 6 7 8 8 12 15