首先,你了解你的数组是什么样子的吗?你有 6 次 2,但你使用了houses[5][6]。那就是5行6列。你应该得到一个错误:
main.cpp:5:55: error: excess elements in array initializer
int houses[5][6] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1}};
^~~~~
你真正想要的是 6 行 2 列。
至于检查二维数组的所有元素是否相等,我会采用简单的方法;将数组的第一个元素存储到变量中,例如命名为v,并检查该值与所有其他元素。如果它不等于一个元素,那么做出决定并说并非所有元素都相等就足够了,如下例所示:
#include <iostream>
bool allEqual(int arr[][2], int rows)
{
int v = arr[0][0];
for(int i = 0; i < rows; ++i)
for(int j = 0; j < 2; ++j)
if(v != arr[i][j])
return false;
return true;
}
int main(void)
{
int houses[6][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1}};
allEqual(houses, 6) ? std::cout << "All " : std::cout << "Not all ";
std::cout << "elements are equal\n";
return 0;
}
如果我用一维模拟二维数组,会更快吗?
我对此表示怀疑。他们的想法是内存位置是连续的,但这是在 2D 情况下最常发生的情况,因为行多于列。
这是我的实验:
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x -O3 -o 2d 2d.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./2d
2D array took 1.48e-10 seconds.
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++0x -O3 -o 1d 1d.cpp
Georgioss-MacBook-Pro:~ gsamaras$ ./1d
Emulating 2D array with 1D array took 1.5e-10 seconds.
和我的代码,基于我的Time measurements (C++):
#include <iostream>
#define ROWS 10000
#define COLS 20
#define REPEAT 1000
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
bool allEqual(int* arr, const int size)
{
int v = arr[0];
for(int i = 0; i < size; ++i)
if(v != arr[i])
return false;
return true;
}
void fill(int* arr, const int size)
{
for(int i = 0; i < size; ++i)
arr[i] = 1;
}
int main(void)
{
const int size = ROWS * COLS;
int houses[size];
fill(houses, size);
bool equal;
using namespace std::chrono;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(int i = 0; i < REPEAT; ++i)
equal = allEqual(houses, size);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "Emulating 2D array with 1D array took " << time_span.count()/(double)REPEAT << " seconds.\n";
return 0;
}
2d.cpp 是直接的方式。
使用此answer 中为 2D 数组提供的相等方法,报告的时序相似。
另外,还有std::equal,在性能上与我上面的代码相当,报告时间为:
std::equal with 2D array took 1.63e-10 seconds.
它的复杂性是:“在 first1 和 last1 之间的距离上达到线性:比较元素直到发现不匹配。”
总结:
std::equal 没问题,对程序员的工作量较小,所以用它吧。