58

次のコードからの出力が配列が等しくないと言っている理由を誰かが私に説明できますか?

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;   
}
4

11 に答える 11

97
if (iar1 == iar2)

ここでiar1iar2は、それぞれの配列の最初の要素へのポインターに減衰しています。これらは 2 つの異なる配列であるため、もちろんポインター値は異なり、比較テストは等しくありません。

要素ごとの比較を行うには、ループを記述する必要があります。またはstd::array代わりに使用

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

}
于 2012-10-12T20:18:16.470 に答える
74

まだ誰も言及していないので、配列をstd::equalアルゴリズムと比較できます。

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.";

と を含める必要が<algorithm>あり<iterator>ます。C++11 をまだ使用していない場合は、次のように記述できます。

if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))
于 2012-10-13T07:25:45.097 に答える
15

配列の内容を比較しているのではなく、配列のアドレスを比較しています。これらは 2 つの別個の配列であるため、アドレスが異なります。

std::vectorstd::deque、などの高レベルのコンテナーを使用して、この問題を回避しますstd::array

于 2012-10-12T20:13:52.493 に答える
6

配列はプリミティブ型ではなく、配列は C++ メモリ内の異なるアドレスに属しています。

于 2012-10-12T20:13:41.237 に答える
1

値ではなくアドレスを比較しています。

于 2012-10-12T20:15:13.943 に答える
0

右。すべてではないにしても、ほとんどの C の実装では、配列識別子を最初の要素へのポインタ (つまり、最初の要素のアドレス) に暗黙的にキャストできます。ここで行っているのは、それらのアドレスを比較していることですが、これは明らかに間違っています。

代わりに、両方の配列を反復処理して、各要素を相互にチェックする必要があります。どちらも失敗せずに最後までたどり着ければ、両者は対等です。

于 2012-10-12T20:14:37.123 に答える
0

配列を使用する場合、実際には配列の最初の要素へのポインターを使用しています。したがって、この条件if( iar1 == iar2 )は実際には 2 つのアドレスを比較します。これらのポインターは、同じオブジェクトをアドレス指定しません。

于 2012-10-12T21:49:15.280 に答える