Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何比较向量和数组?_C++_Arrays_Vector_Compare_Containers - Fatal编程技术网

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}

现在我需要检查向量和数组是否有相同的元素。我不能修改向量和数组,但我可以创建一个新容器,将元素从向量和数组复制到这个新容器中,然后复制它们。我问这个问题,因为我想以一种有效的方式来做。谢谢。

解决这个问题有很多不同的方法,每种方法都有利弊

一些预测试
  • 显然,如果两个范围的大小不同,它们就不可能相等
  • 您可以为范围内的元素计算一个与顺序无关的哈希函数(谢谢,@michaelanderson)。它可以是元素的总和,也可以是所有元素的异或。具有不同哈希值的数组不能相等
  • 您可以创建一个
    无序的\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您需要分析具有真实阵列大小的不同解决方案<代码>多集