2015-12-12 5 views
0
#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; 
} 

У меня есть два динамически распределенных массива с использованием новых (размер может быть или не быть одинаковым). Теперь я хочу сравнить все элементы массива (если размер и элементы такие же, а затем true, если нет ни одного из них, то false).Сравнение динамически распределенных двух массивов в C++

Как сделать на C++? (не интересуется использованием вектора в моем проблемном сценарии)

+0

это невозможно - вы потеряли информацию о размере каждого массива (хотя компилятор знает его на новый []/удалить []). –

+0

В этом случае было бы лучше использовать векторы. В вашем сценарии вам нужно сохранить длину массива. Затем вы можете выполнять итерацию через массивы (например, с помощью цикла 'for'). Если вы обнаружите неравенство, положите итератор на длину, чтобы закончить цикл (или использовать break), а predeclared bool - false. После этого проверьте bool. – Lasoloz

ответ

0

array1 == array2 сравнивает указатели. Они никогда не будут равными. Кроме того, вы не можете знать, сколько элементов в динамически выделяемый массиве, если вы не:

  1. того, его размер хранится отдельно
  2. используя значение дозорного, чтобы определить его конец - выберите значение (например, -1) представлять конец массива (например, строки с стиле обычно используют \0)

Тогда вы будете иметь возможность знать, сколько элементов перебрать, сравнивая элементы обоих массивов.

+0

Вам понадобится цикл, который сравнивает соответствующие элементы в двух массивах. – nicomp

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.

+0

Спасибо, мистер @ Ральф Тандецки. Что такое 'delete [] array1; array1 = NULL; 'эквивалент для вектора? 'Array.clear();'? [принятый ответ] (http://stackoverflow.com/questions/10464992/c-delete-vector-objects-free-memory) говорит: «Вы можете называть ясным, и это уничтожит все объекты, но это не освободит Память".Мне действительно нужно ** освободить память **. –

+0

Память будет автоматически освобождена, когда объекты оставят область – alexisrozhkov

+0

@ Mr.EU Деструктор 'std :: vector' уничтожает каждый оставшийся элемент в векторе отдельно. После этого будет освобождена реальная память, зарезервированная вектором. Таким образом, освобождение ресурсов полностью автоматическое. Btw уничтожение каждого элемента означает ничего не делать в случае 'std :: vector ' потому что 'int' не требует специального уничтожения. Но 'std :: vector ' вызовет деструктор 'std :: string' для каждого элемента при очистке. После этого память, удерживающая строки, будет освобождена. –

0

Здесь можно решить проблему, но я настоятельно рекомендую векторы, в таких случаях.

Вам нужна длина и bool для проверки. check истинно по умолчанию, а массивы должны быть выделены length1 и length2.

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

if (check) 
//... 
+0

@ Mr.EU Это неправильно. Он возвращает false или true в первой итерации. Также обратите внимание, что массивы могут иметь разную длину, как вы упомянули в вопросе. – Lasoloz

0

Я последовал на Ральфа комментарий, потому что я также хотел бы видеть, что StD :: равно сделал, а == оператор станд :: вектор делает правильно, и удивительно простой в использовании, чем станд :: равный оператор. Если вы используете последний, вам нужно будет убедиться, что пользователь begin()/end() для обоих массивов (это версия C++ 14 std :: equal) или добавьте 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 
Смежные вопросы