STL set_symmetric_difference用法

时间:2012-07-07 08:44:06

标签: c++ stl

我正在解决一个编程问题,它希望找到两组之间的SYMMETRIC DIFFERENCE。我用STL set_symmetric_difference解决了这个问题。我有两个vector<int>sAB

  

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中测试了它,并收到一条错误消息:“迭代器不可递增”

2 个答案:

答案 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());

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