【问题标题】:Extract element from 2 vectors?从2个向量中提取元素?
【发布时间】:2010-10-04 23:19:39
【问题描述】:

我有 2 个向量,一个有 vec1{e1,e2,e3,e4},另一个有 vec2 {e2,e4,e5,e7}

如何有效地从上述向量中获取三个向量,使得 1.具有仅在 vec1 中可用的元素,类似地 2 仅具有 vec2 元素和 3.具有公共元素

【问题讨论】:

标签: c++ vector iterator containers


【解决方案1】:

std::set_intersection 应该可以解决问题,如果两个向量都已排序: http://msdn.microsoft.com/en-us/library/zfd331yx.aspx

std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(vec3));

自定义谓词也可用于比较:

std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(vec3), my_equal_functor());

如果没有排序,当然可以先排序,或者也可以遍历vec1,对于每个元素,使用std::find查看是否存在于vec2中。

【讨论】:

    【解决方案2】:

    您要的是vec3 是另外两个的交集。 Jalf 演示了如何使用来自the <algorithm> headerstd::set_intersection 函数填充vec3。但请记住,要使集合函数起作用,向量必须排序

    那么您希望vec1vec2 成为它们与vec3 之间的差异。在集合符号中:

    vec1 := vec1 \ vec3;
    vec2 := vec2 \ vec3;
    

    您可以为此使用std::set_difference 函数,但不能使用它来就地修改向量。您必须计算另一个向量来保持差异:

    std::vector<foo> temp;
    std::set_difference(vec1.begin(), vec1.end(),
                        vec3.begin(), vec3.end(),
                        std::back_inserter(temp));
    vec1 = temp;
    temp.clear();
    std::set_difference(vec2.begin(), vec2.end(),
                        vec3.begin(), vec3.end(),
                        std::back_inserter(temp));
    vec2 = temp;
    

    【讨论】:

      【解决方案3】:

      如果元素数量较少,您可以使用易于实现且运行时间为 O(n2) 的朴素方法。

      如果您有大量元素,您可以从其中一个构建哈希表并在其中查找其他向量的元素。或者,您可以对其中一个进行排序并对其进行二分搜索。

      【讨论】:

        【解决方案4】:

        你描述的问题是向量交集。这取决于输入向量的大小。

        如果两个向量的大小彼此接近,则最好进行合并(如合并排序)。如果一个向量比另一个小得多,请执行以下操作:对于较小向量的每个元素,使用二分搜索在较大向量中搜索该元素。

        这是信息检索中的一个常见问题,您必须与倒排索引相交。有一些关于这方面的研究论文。

        【讨论】:

          猜你喜欢
          • 2013-02-08
          • 2017-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 1970-01-01
          • 2014-12-15
          • 1970-01-01
          相关资源
          最近更新 更多