Arrays vergelijken voor gelijkheid in C++

Kan iemand me alsjeblieft uitleggen waarom de uitvoer uit de volgende code zegt dat arrays niet gelijk zijn ?

int main()
{
    int iar1[] = {1,2,3,4,5};
    int iar2[] = {1,2,3,4,5};
    if (iar1 == iar2)
        cout << "Arrays are equal.";
    else
        cout << "Arrays are not equal.";
    return 0;   
}

1, Autoriteit 100%

if (iar1 == iar2)

HIER iar1EN iar2ZIJN RAADINGEN NAAR PASSERS AAN DE EERSTE ONDERSCHEPING VAN DE BESCHIKKELIJKE ACHTEN. Aangezien ze twee verschillende arrays zijn, zijn de aanwijzerwaarden uiteraard anders en uw vergelijkingstests niet gelijk.

Om een ​​element-wise-vergelijking te doen, moet u een lus schrijven; of gebruik std::arrayin plaats daarvan

std::array<int, 5> iar1 {1,2,3,4,5};
std::array<int, 5> iar2 {1,2,3,4,5};
if( iar1 == iar2 ) {
  // arrays contents are the same
} else {
  // not the same
}

2, Autoriteit 78%

Omdat niemand het al heeft vermeld, kunt u reakkelijk vergelijken met de std::equalalgoritme:

int iar1[] = {1,2,3,4,5};
int iar2[] = {1,2,3,4,5};
if (std::equal(std::begin(iar1), std::end(iar1), std::begin(iar2)))
    cout << "Arrays are equal.";
else
    cout << "Arrays are not equal.";

U moet <algorithm>en <iterator>opnemen. Als u nog geen C++ 11 gebruikt, kunt u schrijven:

if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))

3, Autoriteit 17%

U vergelijkt de inhoud van de arrays niet, u vergelijkt de adressen van de arrays. Omdat het twee afzonderlijke arrays zijn, hebben ze verschillende adressen.

Vermijd dit probleem met het gebruik van hogere containers, zoals std::vector, std::deque, OF std::array.


4, Autoriteit 7%

array is geen primitief type en de arrays behoren tot verschillende adressen in het C++ -geheugen.


5, Autoriteit 6%

Niemand vermeldt memcmp? Dit is ook een goede keuze.

/* memcmp example */
#include <stdio.h>
#include <string.h>
int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";
  int n;
  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
  return 0;
}

Ref: http://www.cplusplus.com/reference/cstring/memcmp/


6, Autoriteit 3%

Als u terughoudend bent om uw bestaande code in te wijzen op std::array, gebruik dan een paar methoden in plaats daarvan in plaats daarvan Niet-type sjabloonargumenten :

//Passed arrays store different data types
template <typename T, typename U, int size1, int size2>
bool equal(T (&arr1)[size1], U (&arr2)[size2] ){
    return false;
}
//Passed arrays store SAME data types
template <typename T, int size1, int size2>
bool equal(T (&arr1)[size1], T (&arr2)[size2] ){
    if(size1 == size2) {
        for(int i = 0 ; i < size1; ++i){
            if(arr1[i] != arr2[i]) return false;
        }
        return true;
    }
    return false;
}

Hier is de Demo . Merk op dat we tijdens het bellen gewoon de arrayvariabelen moeten doorgeven, b.v. equal(iar1, iar2)In uw geval, hoeft u niet de maat van de arrays te halen.


7

U vergelijkt de adressen in plaats van de waarden.


8

Beide winkelgeheugen-adressen naar de eerste elementen van twee verschillende arrays. Deze adressen kunnen dus de uitvoer gelijk zijn.


9

Wanneer we een array gebruiken, gebruiken we echt een aanwijzer naar het eerste element in de array. Vandaar dat deze aandoening if( iar1 == iar2 )eigenlijk twee adressen vergelijkt. Die pointers adresseren niet hetzelfde object.


10

Als u bereid bent om std::arrayte gebruiken in plaats van ingebouwde arrays, kunt u gebruiken:

std::array<int, 5> iar1 = {1,2,3,4,5};
std::array<int, 5> iar2 = {1,2,3,4,5};
if (iar1 == iar2)

Other episodes