C++ 如何比较向量和数组?
我想比较向量和数组。向量和数组中的元素顺序不同,未排序,可以复制。例如 下表相同:C++ 如何比较向量和数组?,c++,arrays,vector,compare,containers,C++,Arrays,Vector,Compare,Containers,我想比较向量和数组。向量和数组中的元素顺序不同,未排序,可以复制。例如 下表相同: vector<int> lvector = {5,7,3,1,2,7}; int larray[6] = {3,5,1,7,2,7} vector<int> lvector = {5,7,3,1,2,7,5}; int larray[7] = {3,5,1,7,2,7,3} vector<int> lvector = {1,1,1,1,2,2}; int larray[6]
vector<int> lvector = {5,7,3,1,2,7};
int larray[6] = {3,5,1,7,2,7}
vector<int> lvector = {5,7,3,1,2,7,5};
int larray[7] = {3,5,1,7,2,7,3}
vector<int> lvector = {1,1,1,1,2,2};
int larray[6] = {1,1,1,1,1,2}
vector={5,7,3,1,2,7};
int-larray[6]={3,5,1,7,2,7}
下面,不一样:
vector<int> lvector = {5,7,3,1,2,7};
int larray[6] = {3,5,1,7,2,7}
vector<int> lvector = {5,7,3,1,2,7,5};
int larray[7] = {3,5,1,7,2,7,3}
vector<int> lvector = {1,1,1,1,2,2};
int larray[6] = {1,1,1,1,1,2}
vector={5,7,3,1,2,7,5};
int-larray[7]={3,5,1,7,2,7,3}
像这样的事情也不一样:
vector<int> lvector = {5,7,3,1,2,7};
int larray[6] = {3,5,1,7,2,7}
vector<int> lvector = {5,7,3,1,2,7,5};
int larray[7] = {3,5,1,7,2,7,3}
vector<int> lvector = {1,1,1,1,2,2};
int larray[6] = {1,1,1,1,1,2}
vector={1,1,1,2,2};
int-larray[6]={1,1,1,1,2}
现在我需要检查向量和数组是否有相同的元素。我不能修改向量和数组,但我可以创建一个新容器,将元素从向量和数组复制到这个新容器中,然后复制它们。我问这个问题,因为我想以一种有效的方式来做。谢谢。解决这个问题有很多不同的方法,每种方法都有利弊 一些预测试
无序的\u multiset
,它保存范围内元素的频率。虽然它平均具有线性复杂度,但由于哈希冲突,它可能是O(n^2)。引用标准(N3337,§23.5.7.2):
复杂性:平均情况线性,最坏情况二次
但是,您还应该记住std::unordered\u set::operator=的复杂性:
对于无序集
和无序映射
operator==
(即,调用
value\u type
,到由key\u equal()
返回的谓词,以及
hash_函数()
)返回的哈希值与
在最坏的情况下,平均情况和到N^2
,其中N
是a.size()
对于unordered\u multiset
和unordered\u multimap
运算符==
在平均情况下与Ei^2之和成比例,并且
在最坏的情况下,N
是a.size()
,而Ei
是
a
中的i
th等效密钥组的大小
然而,如果
每对对应的等效密钥的相应元素
组Eai
和Ebi
按相同顺序排列(通常是这样
例如,如果a
和b
是相同的未修改副本
容器),然后是unordered\u multiset
无序的多重映射与N
成正比(但最坏的情况是
复杂性仍然O(N2)
,例如,对于病理性错误的散列
功能)
例如:
#include <iostream>
#include <unordered_set>
#include <vector>
int main()
{
std::vector<int> v{5, 7, 3, 1, 2, 7};
int arr[] = {3, 5, 1, 7, 2, 7};
std::unordered_multiset<int> mv(std::begin(v), std::end(v));
std::unordered_multiset<int> ma(std::begin(arr), std::end(arr));
std::cout << "Are equal? " << (mv == ma) << std::endl;
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> v{5, 7, 3, 1, 2, 7};
int arr[] = {3, 5, 1, 7, 2, 7};
std::vector<int> sv(v);
std::vector<int> sa(std::begin(arr), std::end(arr));
std::sort(std::begin(sv), std::end(sv));
std::sort(std::begin(sa), std::end(sa));
std::cout << "Are equal? " << (sv == sa) << std::endl;
return 0;
}
这是soon提出的一个变体:
#include <iostream>
#include <unordered_set>
#include <vector>
int main()
{
std::vector<int> v{5, 7, 3, 1, 2, 7};
int arr[] = {3, 5, 1, 7, 2, 7};
std::vector<int> mv(std::begin(v), std::end(v));
std::vector<int> ma(std::begin(arr), std::end(arr));
std::sort(mv.begin(), mv.end()) ;
std::sort(ma.begin(), ma.end()) ;
std::cout << "Are equal? " << (mv == ma) << std::endl;
return 0;
}
#包括
#包括
#包括
int main()
{
std::向量v{5,7,3,1,2,7};
int arr[]={3,5,1,7,2,7};
std::vector mv(std::begin(v),std::end(v));
标准::向量ma(标准::开始(arr),标准::结束(arr));
排序(mv.begin(),mv.end());
排序(ma.begin(),ma.end());
std::cout首先将数组转换为v1向量
v={1,1,2,3,4};向量和
v1={1,1,2,3,4};从数组转换
bool f=0;
if(equal(v.begin(),v.end(),v1.begin())) //compare two vector, if equal return true
{
f=1;
}
}
if(f==1)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
boolf=0;
if(equal(v.begin(),v.end(),v1.begin())//比较两个向量,如果equal返回true
{
f=1;
}
}
如果(f==1)
Cutu应该先尝试它,然后当你遇到问题时,来以你的代码为跳转点来询问你的特定问题,以帮助回答你的问题。幸运的是,C++标准库可以使用,例如(虽然它要求两个范围都是相同的顺序)。您还可以使用自定义谓词来表示另一个容器中一个容器中的所有值。当vector中的元素未排序时,std::equal有效:{5,7,3,1,2,7}@dekoderer如果两个容器的顺序和大小相同,则它有效。如果没有,请再次阅读我的(编辑过的)评论,并按照链接进行操作。顺便说一句,您知道您将larray
声明为一个由五个元素组成的数组,但尝试将其初始化为六个元素?如果您关心速度,有一些改进可以很好地解决这个问题。1.如果它们有不同的长度,那么它们就不可能相等。2.如果它们有不同的和(或按位异或,或乘积等),它们就不能相等。由于这些测试是O(n)
,而多集的构造是O(n log(n))
,因此这些测试可以带来很大的收益。也就是说,在构造多集之前,你应该使用cheep O(n)和O(1)测试来排除它们永远不相等的情况。@Michael:这也是O(n)。你想的是multiset
,而不是unordered\u multiset
@Hurkyl-你可能是对的(找不到这方面的参考)-但无论哪种方式扫描和操作列表都可能比构建另一个数据结构快得多。@MichaelAnderson,是的,你是对的,谢谢。我只是在看构造std::unorederd_multiset
的复杂性标准,它应该是O(n)。一旦我找到答案,我会根据你的建议更新答案。这是一个很好的解决方案,但它需要时间复杂性O(nlogn)-因为排序。也许有更快的解决方案,如无序多集或映射。其他解决方案更快吗?对于map,您有一个O(nlogn)构建时间,而无序_multiset构建速度更快,但比较速度较慢(至少根据cppreference.com的说法)@dekoderer您需要分析具有真实阵列大小的不同解决方案<代码>多集