假设您有2个向量说v1
和v2
,其中包含以下值:
v1 = {8,4,9,9,1,3};
v2 = {9,4,3,8,1,9};
检查它们是否“平等”的最STL方法是什么?我定义“相等”意味着无论顺序如何,内容都是相同的。我更愿意这样做而不进行排序。
我倾向于构建两个std::map<double, int>
来计算每个向量的元素。
所有,我需要的是算法中的布尔值是/否。
你说什么?
Stack Overflow上的其他对话依据对向量进行排序,我宁愿避免这种情况。因此这个新线程。
答案 0 :(得分:4)
我倾向于构建两个std :: map来计算每个向量的元素。
这比创建排序向量要慢得多。 (另请注意,std::map
是通过排序提供的;它只是使用红黑树或AVL树来实现这一点。)地图是为插入和查找的均匀混合而优化的数据结构;但是你的用例是一大堆插入,然后是一堆没有重叠的查找。
我只是对矢量进行排序(或制作副本并对其进行排序,如果不允许销毁源副本),然后使用内置operator ==
的矢量。
答案 1 :(得分:4)
对向量进行排序并调用set_difference仍然是最好的方法。 如果副本很重,那么两个未排序数组之间的比较会更糟吗?
如果您希望当前数组不变,可以复制当前数组吗?
v1 = {8,4,9,9,1,3};
v2 = {9,4,3,8,1,9};
// can trade before copy/sort heavy work
if (v1.size() != v2.size()){
}
std::vector<int> v3(v1);
std::vector<int> v4(v2);
sort(v3.begin(), v3.end());
sort(v4.begin(), v4.end());
return v3 == v4;
答案 2 :(得分:3)
我认为由于某种原因你不能对矢量进行排序,很可能是因为你仍然需要它们的原始顺序,或者复制起来很昂贵。否则,只需对它们进行排序。
在每个向量中创建一个“视图”,允许您以任何顺序查看向量。您可以使用指针向量来执行此操作,指针按顺序开始指向元素。然后对两个视图进行排序,为每个向量生成一个排序视图。然后比较两个视图,比较它们视图顺序中的两个向量。这样可以避免对矢量本身进行排序。
答案 3 :(得分:1)
最初的想法是以集合的方式工作,因为这就是你实际上在思考的问题,但这确实需要排序。这可以在O(n)
中完成,方法是将两者都转换为哈希映射并检查那里的相等性。
答案 4 :(得分:-1)
只取第一个向量并将其与第二个向量中的每个元素进行比较。
如果第一个中的一个值在第二个中找不到,则向量是不同的。 在最坏的情况下,需要O(n * m)时间,其中n =第一矢量的大小,m =第二矢量的大小。
答案 5 :(得分:-1)
这个util方法将帮助你比较2 int [],如有任何问题请告诉我
public static boolean compareArray(int [] v1,int [] v2){
boolean returnValue = false;
if(v1.length != v2.length)
returnValue = false;
if(v1.length == 0 || v2.length == 0)
returnValue = false;
List<Integer> intList = Ints.asList(v2);
for(int element : v1){
if(!intList.contains(element)){
returnValue = false;
break;
}else{
returnValue = true;
}
}