【问题标题】:Compare dynamically allocated two array in C++在 C++ 中比较动态分配的两个数组
【发布时间】:2016-03-18 08:00:36
【问题描述】:
#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;
}

我有两个使用 new 动态分配的数组(大小可能相同也可能不同)。现在我想比较数组的所有元素(如果大小和元素相同,则为真,如果不是其中任何一个则为假)。

在 C++ 中怎么做? (对在我的问题场景中使用向量不感兴趣)

【问题讨论】:

  • 那是不可能的——你丢失了每个数组的大小信息(尽管编译器在 new[]/delete[] 知道它)。
  • 在这种情况下使用向量会更好。在您的场景中,您需要存储数组长度。然后您可以遍历数组(例如使用for 循环)。如果发现不等式,则将迭代器设置为 lenght 以完成循环(或使用 break),并将预先声明的 bool 设置为 false。在此之后检查布尔值。

标签: c++ compare dynamic-arrays


【解决方案1】:

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

一旦你有了它,你可以通过以下方式比较两个数组:

#include <vector>

int main()
{
    std::vector<int> v1 = { 1, 2, 3 };
    std::vector<int> v2 = { 1, 2, 3, 4 };
    const bool theyAreEqual = v1 == v2;
}

像你一样比较两个指针,只比较第一个元素的地址,而不是逐个元素的动态数组的大小和内容。这也是原因之一,使用 std::vector 而不是 C 样式的数组更安全。

【讨论】:

  • 感谢@Ralph Tandetzky 先生。向量的delete []array1; array1=NULL; 等价物是什么? array.clear();? accepted answer 说“您可以调用 clear,这将销毁所有对象,但不会释放内存”。我真的需要释放内存
  • 对象离开作用域时内存会自动释放
  • @Mr.EU std::vector 的析构函数分别销毁向量中的每个剩余元素。之后,向量保留的实际内存将被释放。所以资源释放是完全自动的。顺便说一句,在std::vector&lt;int&gt; 的情况下销毁每个元素意味着什么都不做,因为int 不需要特殊销毁。但是std::vector&lt;std::string&gt; 将在清理时对每个元素调用std::string 的析构函数。之后,保存字符串的内存将被释放。
【解决方案2】:

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

  1. 单独存储其大小
  2. 使用标记值确定其结束 - 您选择一个值(例如 -1)来表示数组的结束(如 c 样式字符串通常使用 \0

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

【讨论】:

  • 您需要一个循环来比较两个数组中的对应元素。
【解决方案3】:

这是一种解决方法,但在这种情况下,我强烈推荐使用向量。

您需要长度和布尔值进行检查。 check 默认为真,数组应分配length1length2

//...
if (length1 != length2) check = false;
else for (int i = 0; i < length1; i++)
{
    if (array1[i] != array2[i])
    {
        check = false;
        break;
    }
}

if (check)
//...

【讨论】:

  • @Mr.EU 这是错误的。它在第一次迭代中返回 false 或 true。另请注意,正如您在问题中提到的那样,数组可以有不同的长度。
【解决方案4】:

我跟进了 Ralph 的评论,因为我还想看看 std::equal 做了什么,std::vector 的 == 操作符做了正确的事情,而且比 std::equal 操作符更简单易用.如果使用后者,则需要确保两个数组都使用 begin()/end()(它是 std::equal 的 C++14 版本),或者添加 v1.size() == v2 .size() &&...

#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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多