如何将矢量与数组进行比较

How to compare vector with array?

本文关键字:数组 比较      更新时间:2023-10-16

我想将向量与数组进行比较。向量和数组中的元素顺序不同,未排序并且可以重复。例如

以下是相同的:

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;
}
有很多

不同的方法可以解决这个问题,每种方法都有过程和缺点。

一些预测试

  1. 显然,如果两个范围的大小不同,则它们不能相等。
  2. 您可以为范围内的元素计算与顺序无关的哈希函数(谢谢,@Michael安德森)。它可以是元素的总和,也可以全部xor。具有不同哈希值的数组不能相等。

std::unordered_multiset

您可以创建一个 unordered_multiset ,用于保存范围内元素的频率。虽然它的平均复杂度是线性的,但由于哈希冲突,它可能是 O(n^2)。引用自标准(N3337,§ 23.5.7.2):

复杂度:平均情况线性,最坏情况二次。

但是,您还应该记住std::unordered_set::operator==的复杂性:

对于unordered_setunordered_map,复杂度 operator==(即呼叫==运营商的次数 value_type ,到 key_equal() 返回的谓词,以及 hash_function() ) 返回的哈希与 N 中的 平均情况和N^2在最坏的情况下,N a.size().

对于unordered_multisetunordered_multimap,复杂性 在平均情况下,operator==sum of Ei^2成正比,并且 在最坏的情况下N^2,其中Na.size()Eia 中第 i 个等效键组的大小。

但是,如果 每个对应等效键对的相应元素 Eai组和Ebi组按相同的顺序排列(通常如此 情况,例如,如果ab是同一内容的未修改副本 容器),然后是unordered_multiset的平均情况复杂度 并且unordered_multimapN成正比(但最坏的情况) 复杂性仍然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;
}

这是将vectorarray进行比较的模板函数:

#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;