我有与一种具有VEC1 {E1,E2,E3,E4},而另一个与VEC2 {E2,E4,E5,E7}从2个向量中提取元素?
2矢量如何有效地获得从上述载体使得三个矢量1.has元素,只有在VEC 1可用类似的2只VEC 2单元和3,具有共同的元素
我有与一种具有VEC1 {E1,E2,E3,E4},而另一个与VEC2 {E2,E4,E5,E7}从2个向量中提取元素?
2矢量如何有效地获得从上述载体使得三个矢量1.has元素,只有在VEC 1可用类似的2只VEC 2单元和3,具有共同的元素
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());
如果它们没有排序,你当然可以先对它们进行排序,或者您可以通过迭代VEC 1,对于每个元素,使用std ::发现,看它是否在VEC 2存在。
如果元素数量很少,则可以使用易于实现且具有O(n )运行时间的朴素方法。
如果您有大量元素,您可以从其中一个构建哈希表并查找其中的其他向量元素。或者,您可以对其中的一个进行排序并通过二进制搜索。
您描述的问题是矢量交集。这取决于输入向量的大小。
如果两个向量的大小彼此接近,则合并(如合并排序)是最好的。如果一个矢量比另一个小得多,则执行以下操作:对于较小矢量的每个元素,使用二分搜索在较大矢量中搜索该元素。
这是信息检索中的一个常见问题,您必须与倒排索引相交。有一些关于此的研究论文。
你要求的是vec3
是十字路口其他两个。 Jalf演示了如何使用the <algorithm>
header的std::set_intersection
函数填充vec3
。但请记住,要使所设置的功能正常工作,必须对向量进行排序。
那么你一定要vec1
和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;
什么是元素的类型?他们有可比性吗?只有4个元素? – 2009-02-02 17:02:43
是的,他们是可比较的,而不仅仅是4元素 – yesraaj 2009-02-02 17:04:58