2017-10-09 62 views
1

我正在编写代码以返回v1中的数据,该数据不在v2向量中,不使用C++重复。如何找到不重复的两个向量的不同集合?

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
         std::inserter(diff, diff.begin())); 

然而,当我输入V1,V2是

v1=[137 138 139 140 141 142 143 144 148 150 157 158 161] 
v2=[138 157 150 140 137 158 141 139 143 148] 

输出结果意想不到的解决方案

diff=[ 137 139 140 141 142 143 144 148 150 161] 

虽然,我期望的解决方案必须是

diff=[ 142 144 161] 

我应该纠正我的功能?谢谢

+0

如果您阅读例如[这个'std :: set_difference'参考](http://en.cppreference.com/w/cpp/algorithm/set_difference),你会看到它“复制**排序**范围中的元素[first1,last1 )在**排序**范围[first2,last2)中找不到从d_first开始的范围“。而这正是它所做的。请注意我添加的重点,关于数据被**排序**为*两个*范围。 –

+0

那么,我应该如何实现我的预期结果。我知道MATLAB中的一些函数,因为'set_diff'可以达到我的预期结果 – KimHee

+1

确保* both *向量[sorted](http://en.cppreference.com/w/cpp/algorithm/sort)。 –

回答

1

v2需要排序。正如v1(它是)。函数set_difference假定两个向量都被排序。

算法只需要遍历每个向量一次,只需要比较每个向量的当前游标。这是一个显着的性能改进,并且节省了使用任意输入的算法的空间。

+0

谢谢。它现在工作。不仅v2,而且v1 – KimHee

0

看看这个方法:

std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), 
         std::inserter(diff, diff.begin())); 

这就是所谓的set_difference是有原因的:)

只需使用set容器,而不是你vector的。他们将确保您的数据已排序并且算法成功。

相关问题