次のコードからの出力が配列が等しくないと言っている理由を誰かが私に説明できますか?
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;
}
次のコードからの出力が配列が等しくないと言っている理由を誰かが私に説明できますか?
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;
}
if (iar1 == iar2)
ここでiar1
とiar2
は、それぞれの配列の最初の要素へのポインターに減衰しています。これらは 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
}
まだ誰も言及していないので、配列を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))
配列の内容を比較しているのではなく、配列のアドレスを比較しています。これらは 2 つの別個の配列であるため、アドレスが異なります。
std::vector
、std::deque
、などの高レベルのコンテナーを使用して、この問題を回避しますstd::array
。
配列はプリミティブ型ではなく、配列は C++ メモリ内の異なるアドレスに属しています。
値ではなくアドレスを比較しています。
右。すべてではないにしても、ほとんどの C の実装では、配列識別子を最初の要素へのポインタ (つまり、最初の要素のアドレス) に暗黙的にキャストできます。ここで行っているのは、それらのアドレスを比較していることですが、これは明らかに間違っています。
代わりに、両方の配列を反復処理して、各要素を相互にチェックする必要があります。どちらも失敗せずに最後までたどり着ければ、両者は対等です。
配列を使用する場合、実際には配列の最初の要素へのポインターを使用しています。したがって、この条件if( iar1 == iar2 )
は実際には 2 つのアドレスを比較します。これらのポインターは、同じオブジェクトをアドレス指定しません。