在C++中比较数组是否相等

vla*_*koc 41 c++ arrays comparison equality

有人可以向我解释为什么以下代码的输出是说数组不相等

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;   
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 62

if (iar1 == iar2)
Run Code Online (Sandbox Code Playgroud)

这里iar1并且iar2正在衰减到指向各个数组的第一个元素的指针.由于它们是两个不同的数组,因此指针值当然不同,并且您的比较测试不相等.

要进行元素比较,你必须要写一个循环; 或者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

}
Run Code Online (Sandbox Code Playgroud)

  • "......你必须写一个循环......"更好的是使用std :: equal.不要忽视使用原始数组是主要问题. (4认同)
  • +1为唯一的答案,单词"decay"(或任何其他明确说明的话). (2认同)
  • 对“腐烂”的很好解释:/sf/answers/102301461/ (2认同)

Ins*_*Now 50

由于没有人提及它,您可以将数组与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.";
Run Code Online (Sandbox Code Playgroud)

你需要包括<algorithm><iterator>.如果你还没有使用C++ 11,你可以写:

if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))
Run Code Online (Sandbox Code Playgroud)

  • 如果 `iar1` 大于 `iar2`,这如何设法避免超出 `iar2` 的末尾?你不应该也在那里传递 `std:end(iar2)` 吗? (3认同)
  • 一个有趣的事实是,即使iar2是{1,2,3,4,5,6},上述条件仍然适用. (2认同)
  • 这样做的好处是,如果有一天你恢复理智并想转换代码以使用它们而不是 C 数组,那么完全相同的语法也适用于 `std::vector` 和 `std::array`。 (2认同)
  • 是的,您应该使用 4 参数重载!std::等于(std::开始(iar1),std:结束(iar1),std:开始(iar2),std:结束(iar2); (2认同)

Fre*_*son 14

您没有比较数组的内容,而是比较数组的地址.由于它们是两个独立的数组,因此它们具有不同的地址.

通过使用更高级别的容器,如避免这个问题std::vector,std::dequestd::array.

  • 重要的是要注意这些容器已经实现了自己的`==`运算符来执行此检查. (2认同)

Pau*_* S. 6

Array不是基本类型,并且数组属于C++内存中的不同地址.


Xia*_*eng 5

没人提memcmp?这也是一个不错的选择。

/* 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;
}
Run Code Online (Sandbox Code Playgroud)

参考:http : //www.cplusplus.com/reference/cstring/memcmp/