如何将矢量与数组进行比较
How to compare vector with array?
我想将向量与数组进行比较。向量和数组中的元素顺序不同,未排序并且可以重复。例如
以下是相同的:
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}
现在我需要检查向量和数组是否具有相同的元素。我无法修改向量和数组,但我可以创建一个新容器并将元素从向量和数组复制到这个新容器,然后复制它们。我问这个问题,因为我想以有效的方式做到这一点。谢谢。
这是很快提出的一个变体:
#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;
}
不同的方法可以解决这个问题,每种方法都有过程和缺点。
一些预测试
- 显然,如果两个范围的大小不同,则它们不能相等。
- 您可以为范围内的元素计算与顺序无关的哈希函数(谢谢,@Michael安德森)。它可以是元素的总和,也可以全部
xor
。具有不同哈希值的数组不能相等。
std::unordered_multiset
您可以创建一个 unordered_multiset
,用于保存范围内元素的频率。虽然它的平均复杂度是线性的,但由于哈希冲突,它可能是 O(n^2)。引用自标准(N3337,§ 23.5.7.2):
复杂度:平均情况线性,最坏情况二次。
但是,您还应该记住std::unordered_set::operator==
的复杂性:
对于
unordered_set
和unordered_map
,复杂度operator==
(即呼叫==
运营商的次数value_type
,到key_equal()
返回的谓词,以及hash_function()
) 返回的哈希与N
中的 平均情况和N^2
在最坏的情况下,N
a.size()
.对于
unordered_multiset
和unordered_multimap
,复杂性 在平均情况下,operator==
与sum of Ei^2
成正比,并且 在最坏的情况下N^2
,其中N
是a.size()
,Ei
是a
中第i
个等效键组的大小。但是,如果 每个对应等效键对的相应元素
Eai
组和Ebi
组按相同的顺序排列(通常如此 情况,例如,如果a
和b
是同一内容的未修改副本 容器),然后是unordered_multiset
的平均情况复杂度 并且unordered_multimap
与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;
}
std::sort
您可以比较范围的排序副本。根据标准(N3337,§ 25.4.1.1),它具有O(n * log(n))
复杂性:
复杂度:O(N log(N))(其中N ==最后一个 - 第一个)比较。
例:
#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;
}
这是将vector
与array
进行比较的模板函数:
#include <array>
#include <algorithm>
#include <vector>
template <class T, std::size_t N>
bool equal(const std::vector<T>& v, const std::array<T, N>& a)
{
if (v.size() != N)
return false;
return std::equal(v.begin(), v.end(), a.begin());
}
使用示例:
std::vector<int> v = {1, 2, 3};
std::array<int, 4> a = {1, 2, 3, 4};
bool eq = equal(v, a);
首先将数组转换为 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;
- 比较字符数组
- 如何在C++中比较两个char数组
- 比较if语句中的数组值和int值
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 比较 c++ 中的字符数组
- 如何将字符串字符与结构数组进行比较?
- 将constexpr字节数组与缓冲区的一部分(指向数据的指针)进行比较
- 在C++中返回基元类型数组(Java比较)
- 谷歌测试比较指针数组的内容
- 比较嵌套 for 循环中的两个 wchar 数组?
- C++ 将二维数组索引与条件语句中的函数值进行比较
- 在 c++ 中比较不相等数组或字符串的方法
- 将子字符串与字符串数组进行比较的 IF 条件会在C++中产生错误
- 如何使用 for 循环来比较不同大小的数组
- 如何为映射和priority_queue编写比较器,其中元素是二维数组
- 比较/搜索数组中多个整数的最佳解决方案
- 从数组比较2个字符串时,程序崩溃
- C++ 更快的字符数组比较
- c++数组比较和移动?为什么苹果不动?
- 快速数组比较和替换最接近值的元素的算法.(跟踪点)