STL set_symmetric_difference 用法

1 c++ stl

我正在解决一个编程问题,它想找到两组之间的对称差异。我已经使用 STL 的set_symmetric_difference. 我得到了两个vector<int>sA并且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);
Run Code Online (Sandbox Code Playgroud)

注意: 我得到了其余示例的正确答案。这个例子只给了我这个错误的答案。

我已经在 Visual Studio 中对其进行了测试,并收到一条错误消息:“Iterator not incrementable”

jua*_*nza 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;
Run Code Online (Sandbox Code Playgroud)

这产生

21 43 76 78 87 98 123 234 312 342 645 654 756 876