当前位置:  开发笔记 > 编程语言 > 正文

从两个向量中删除常见实体?

如何解决《从两个向量中删除常见实体?》经验,为你挑选了1个好方法。

说我有vector,vector如何删除它们的公共实体我为class1对象class1a,class1b定义了==运算符



1> Luc Touraill..:

在STL算法提供多种功能进行设定操作,特别是计算集对称差,这是你所需要的.

这是一个使用示例:

#include 
#include 

int main(int argc, char **argv) {

    std::vector v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    v1.push_back(5);
    v1.push_back(6);

    std::vector v2;
    v2.push_back(2);
    v2.push_back(4);
    v2.push_back(6);
    v2.push_back(8);

    // Ranges must be sorted!
    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::vector res; // Will contain the symmetric difference
    std::set_symmetric_difference(v1.begin(), v1.end(), 
                                  v2.begin(), v2.end(), 
                                  std::back_inserter(res));

    // Copy result to the output
    std::copy(res.begin(), res.end(), std::ostream_iterator(cout, " "));
    // Prints "1 3 5"

    return 0;
}

std::set_symmetric_difference需要两个范围(即两对OutputIterators)和一个InputIterator来放置结果.它还将迭代器返回到结果范围的末尾.


编辑

我刚看了你对你问题的评论.如果要修改两个原始矢量,可以使用std::set_difference:

vector::iterator endRange;
endRange = set_difference(v1.begin(), v1.end(), 
                          v2.begin(), v2.end(), 
                          v1.begin());
v1.erase(endRange, v1.end());

在这里,我们将设置差异v1-v2的结果放入v1.但是,我们不能反之亦然,因为现在修改了v1.解决方案是计算v1和v2的交点,然后计算与此交点的差异:

vector inter;
set_intersection(v1.begin(), v1.end(),
                 v2.begin(), v2.end(),
                 back_inserter(inter));
// inter is "2 4 6"

v1.erase(set_difference(v1.begin(), v1.end(),
                        inter.begin(), inter.end(),
                        v1.begin()),
         v1.end());
// v1 is "1 3 5"

v2.erase(set_difference(v2.begin(), v2.end(),
                        inter.begin(), inter.end(),
                        v2.begin()),
         v2.end());
// v2 is "8"

我想有更多高性能的解决方案,但这一点很清楚,并且通过使用广为人知的stl算法真正传达了你的意图.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有