C++ 比较C+中动态分配的两个数组+; #包括 使用名称空间std; int main() { int*array1=新int[5](); int*array2=新的int[7](); 数组1[2]=3;//或任何更改 array2[2]=3;//两个数组 if(array1==array2) { //若两个数组的所有值都相等 } 其他的 { //若两个数组的所有值都不相等 } 返回0; }

C++ 比较C+中动态分配的两个数组+; #包括 使用名称空间std; int main() { int*array1=新int[5](); int*array2=新的int[7](); 数组1[2]=3;//或任何更改 array2[2]=3;//两个数组 if(array1==array2) { //若两个数组的所有值都相等 } 其他的 { //若两个数组的所有值都不相等 } 返回0; },c++,compare,dynamic-arrays,C++,Compare,Dynamic Arrays,我有两个使用new动态分配的数组(大小可能相同,也可能不同)。现在我想比较数组中的所有元素(如果大小和元素相同,则为true,如果两者都不相同,则为false) 如何在C++中实现?(对在我的问题场景中使用vector不感兴趣)array1==array2比较指针。他们永远不会平等。此外,您无法知道动态分配的数组中有多少个元素,除非您: 大小分开存放的 使用sentinel值确定其结束-您可以选择一个值(例如-1)来表示数组的结束(就像c样式字符串通常使用\0) 然后,您将能够知道要迭代多少个元

我有两个使用new动态分配的数组(大小可能相同,也可能不同)。现在我想比较数组中的所有元素(如果大小和元素相同,则为true,如果两者都不相同,则为false)


如何在C++中实现?(对在我的问题场景中使用vector不感兴趣)

array1==array2
比较指针。他们永远不会平等。此外,您无法知道动态分配的数组中有多少个元素,除非您:

  • 大小分开存放的
  • 使用sentinel值确定其结束-您可以选择一个值(例如
    -1
    )来表示数组的结束(就像c样式字符串通常使用
    \0

  • 然后,您将能够知道要迭代多少个元素,比较两个数组的元素。

    首先,我鼓励您对动态分配的数组使用
    std::vector
    。它们将安全自动地释放分配的内存,您可以随时检索它们的大小,而无需额外的手动簿记

    一旦完成,您可以通过以下方式比较这两个阵列:

    #include <iostream>
    using namespace std;
    
    int main() 
    {
       int *array1 = new int [5]();
       int *array2 = new int [7]();
    
       array1[2] = 3;// or anychange
       array2[2] = 3;// to both arrays
    
       if (array1==array2)
       {
        //if all values of the both arrays are equal
       }
       else
       {
        //if all values of the both arrays are not equal
       }
       return 0;
    }
    
    #包括
    int main()
    {
    向量v1={1,2,3};
    向量v2={1,2,3,4};
    const bool theyAreEqual=v1==v2;
    }
    

    比较两个指针时,只比较第一个元素的地址,而不比较动态数组elementwise的大小和内容。这就是其中一个原因,使用
    std::vector
    而不是C型数组要安全得多。

    这里有一种解决方法,但我强烈建议在这种情况下使用vector

    你需要长度和卷轴来检查<默认情况下,code>check为true,数组应分配
    length1
    length2

    #include <vector>
    
    int main()
    {
        std::vector<int> v1 = { 1, 2, 3 };
        std::vector<int> v2 = { 1, 2, 3, 4 };
        const bool theyAreEqual = v1 == v2;
    }
    
    /。。。
    如果(length1!=length2)检查=false;
    用于(int i=0;i
    我跟进了Ralph的评论,因为我也想看看std::equal做了什么,std::vector的==运算符做了正确的事情,而且比std::equal运算符使用起来更简单。如果使用后者,则需要确保两个数组都使用begin()/end()(这是std::equal的C++14版本),或者添加v1.size()==v2.size()&&

    #包括
    #包括
    int main()
    {
    向量v1={1,2,3};
    向量v2={1,2,3,4};
    向量v3={1,2,3};
    常数布尔值等于1v2=v1=v2;
    常数布尔值等于1v3=v1==v3;
    const bool theyareequalstv1v2=std::equal(v1.begin(),v1.end(),v2.begin(),v2.end());
    const bool theyareequalsdv1v2bad=std::equal(v1.begin(),v1.end(),v2.begin());
    const bool theyareequalstv1v3=std::equal(v1.begin()、v1.end()、v3.begin()、v3.end());
    //标准::根据http://en.cppreference.com/w/cpp/algorithm/equal 事实上
    //仅比较第一个范围,因此两个数组都需要begin()/end()
    printf(“等于v1v2:%d\n”,它们等于1v2);
    printf(“等于v1v3:%d\n”,它们等于1v3);
    printf(“标准::等于v1v2:%d\n”,它们是相等的v1v2);
    printf(“std::equal v1v2 bad:%d\n”,它们是相等的v1v2bad);
    printf(“std::equalv1v3:%d\n”,它们是相等的v1v3);
    返回0;
    }
    clang++-std=c++14-stdlib=libc++c.cpp
    输出:
    等于v1v2:0
    等于v1v3:1
    标准::等于v1v2:0
    标准::等于v1v2错误:1
    标准::等于v1v3:1
    
    这是不可能的-您丢失了每个数组的大小信息(尽管编译器在new[]/delete[]中知道它)。在这种情况下,最好使用向量。在您的场景中,需要存储数组长度。然后您可以遍历数组(例如,使用
    for
    循环)。如果您发现一个不等式,那么将迭代器设置为lenght to finish循环(或使用break),并将预先声明的bool设置为false。在此之后,请检查bool。您将需要一个循环来比较两个数组中的相应元素。谢谢@Ralph Tandetzky先生。什么是
    delete[]array1;array1=NULL向量的等效值<代码>数组.clear()?表示“您可以调用clear,这将销毁所有对象,但不会释放内存”。我真的需要释放内存。当对象离开时,内存将自动释放scope@Mr.EU
    std::vector
    的析构函数分别销毁向量中的所有剩余元素。之后,向量保留的实际内存将被释放。因此,资源释放是完全自动的。顺便说一句,销毁每个元素意味着在
    std::vector
    的情况下什么也不做,因为
    int
    不需要特殊销毁。但是清理时,
    std::vector
    会在每个元素上调用
    std::string
    的析构函数。之后,保存字符串的内存将被释放。@Mr.EU这是错误的。它在第一次迭代中返回false或true。还要注意,正如您在问题中提到的,数组可以有不同的长度。
    //...
    if (length1 != length2) check = false;
    else for (int i = 0; i < length1; i++)
    {
        if (array1[i] != array2[i])
        {
            check = false;
            break;
        }
    }
    
    if (check)
    //...
    
    #include <algorithm>
    #include <vector>
    
    int main()
    {
        std::vector<int> v1 = { 1, 2, 3 };
        std::vector<int> v2 = { 1, 2, 3, 4 };
        std::vector<int> v3 = { 1, 2, 3 };
        const bool theyAreEqualv1v2 = v1 == v2;
        const bool theyAreEqualv1v3 = v1 == v3;
    
        const bool theyAreEqualStdv1v2 = std::equal(v1.begin(),v1.end(), v2.begin(),v2.end());
        const bool theyAreEqualStdv1v2bad = std::equal(v1.begin(),v1.end(), v2.begin());
        const bool theyAreEqualStdv1v3 = std::equal(v1.begin(),v1.end(), v3.begin(),v3.end());
        // std::equal according to http://en.cppreference.com/w/cpp/algorithm/equal actually
        // only compares the first range thus you would really need     begin()/end() for both arrays
    
        printf("equal v1v2: %d\n",theyAreEqualv1v2);
        printf("equal v1v3: %d\n",theyAreEqualv1v3);
        printf("std::equal v1v2: %d\n",theyAreEqualStdv1v2);
        printf("std::equal v1v2 bad: %d\n",theyAreEqualStdv1v2bad);
        printf("std::equal v1v3: %d\n",theyAreEqualStdv1v3);
        return 0;
    }
    
    clang++ -std=c++14 -stdlib=libc++  c.cpp 
    output:
    equal v1v2: 0
    equal v1v3: 1
    std::equal v1v2: 0
    std::equal v1v2 bad: 1
    std::equal v1v3: 1