首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL set_symmetric_difference使用

STL set_symmetric_difference使用
EN

Stack Overflow用户
提问于 2012-07-07 08:44:05
回答 2查看 2K关注 0票数 1

我在解决一个编程问题,它想要找出两个集合之间的对称差。我用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}

有什么问题吗?这是我的代码:

代码语言:javascript
复制
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中测试过它,并得到了一条错误消息:"Iterator不能增量“

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-07 09:09:01

问题在于向量c的初始化。逻辑稍有错误,因为输出范围的最大大小可能与两个输入范围的总和一样大。由于事先不知道大小,所以最好从一个空的输出向量开始,然后使用push_back和一个插入器

代码语言:javascript
复制
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

票数 5
EN

Stack Overflow用户

发布于 2012-07-07 09:10:47

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

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

我把它改成:

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11373583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档