1

我正在解决一个编程问题,它想要找到两组之间的对称差异。我已经使用 STL 解决了它set_symmetric_difference。我得到两个vector<int>s,AB:

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 中对其进行了测试,并收到一条错误消息:“Iterator not incrementable”

4

2 回答 2

5

问题在于 vector 的初始化c。逻辑稍有错误,因为输出范围的最大大小可能与两个输入范围的总和一样大。由于您不知道先验的大小,因此最好从空输出向量开始,然后将 push_back 与std::back_inserter一起使用:

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

于 2012-07-07T09:09:01.597 回答
3

当我运行您的代码时,我从向量迭代器中得到一个异常,该异常不可递增。我认为问题出在这里:

vector c(A.size() < B.size() ? B.size() : A.size());

我将其更改为:

vector c(A.size() + B.size());

并毫无例外地运行它。我也得到与你写的相同的数字(正确的数字)。

于 2012-07-07T09:10:47.947 回答