我正在解决一个编程问题,它希望找到两组之间的SYMMETRIC DIFFERENCE。我用STL set_symmetric_difference
解决了这个问题。我有两个vector<int>s
,A
和B
:
A = {342,654,897,312,76,23,78}
B = {21,43,87,98,23,756,897,234,645,876,123}
可以回复(正确答案):
{21,43,76,78,87,98,123,234,312,342,645,654,756,876}
但我明白了:
{21,43,76,78,87,98,123,234,312,342,645,65,756,876}
有什么问题?这是我的代码:
sort(A.begin(), A.end());
sort(B.begin(), B.end());
// allocate the smallest size of A,B as maximum size
vector<int> c(A.size() < B.size() ? B.size() : A.size());
vector<int>::iterator i;
i = set_symmetric_difference(A.begin(), A.end(), B.begin(), B.end(), c.begin());
return vector<int>(c.begin(), i);
注意: 我得到了其他例子的正确答案。这个例子只给出了我错误的答案。
我在Visual Studio中测试了它,并收到一条错误消息:“迭代器不可递增”
答案 0 :(得分:4)
问题在于向量c
的初始化。逻辑略有错误,因为输出范围的最大大小可能与两个输入范围的总和一样大。既然您不知道先验大小,那么最好先使用空输出向量,然后使用带有std::back_inserter的push_back代替:
sort(A.begin(), A.end());
sort(B.begin(), B.end());
std::vector<int> c;
set_symmetric_difference(A.begin(), A.end(),
B.begin(), B.end(), std::back_inserter(c));
return c;
这会产生
21 43 76 78 87 98 123 234 312 342 645 654 756 876
答案 1 :(得分:2)
当我运行你的代码时,我从向量迭代器得到一个不可递增的异常。我认为问题在于:
vector c(A.size() < B.size() ? B.size() : A.size());
我把它改为:
vector c(A.size() + B.size());
并且没有例外地运行它。我也得到与你写的相同的数字(正确的数字)。