我正在寻找一种方法来查找C ++中2D整数数组的最大值和最小值。我知道std::max_element()
和std::min_element()
,但它们似乎只适用于一维数组。
可以通过以下方式声明和初始化2D数组:
int temp[5][5];
for(int x = 0; x < 5; x++)
{
for(int y = 0; y < 5; y++)
{
temp[x][y] = some_random_number;
}
}
一种简单的方法可以是:
int min = high_number;
int max = low_number;
for(int x = 0; x < 5; x++)
{
for(int y = 0; y < 5; y++)
{
if(temp[x][y] < min)
{
min = temp[x][y];
}
if(temp[x][y] > max)
{
max = temp[x][y];
}
}
}
但这似乎没有得到很好的优化。有人能提出一些建议或提出更好的建议吗?
答案 0 :(得分:5)
您仍然可以像这样使用std::min_element
和std::max_element
:
int arr[2][2] = {{434, 43}, {9826, 2}};
auto pair = std::minmax_element(&arr[0][0], &arr[0][0] + 4);
其中4
是元素的总数。
请注意,为了便于阅读,上述解决方案使用operator&
将地址设置为数组的开头,但建议使用std::addressof
,因为operator&
可能会重载。
如果需要,还可以为等效的二维数组begin
和end
函数声明辅助函数:
template<typename T, std::size_t N, std::size_t M>
auto bi_begin(T (&arr)[N][M]) {
return std::addressof(arr[0][0]);
}
template<typename T, std::size_t N, std::size_t M>
auto bi_end(T (&arr)[N][M]) {
return bi_begin(arr) + N * M;
}
我故意避免使用名称begin
和end
,因为它可以在这里产生无限的讨论。
总的来说,我建议您定义matrix
类型,该std::array
类型实现为M * N
个begin
元素,然后提供适当的end
和{{1}}成员函数,然后可以与任何标准算法一起使用。
答案 1 :(得分:4)
如果您的数组/矩阵的内容没有其他限制,那么您不能比查看每个元素做得更好。这意味着您的解决方案实际上是渐近运行时间的最佳解决方案。
我还认为它在可读性方面很好,但有些人可能会觉得这更容易阅读(因为它更短):
for(int x = 0; x < 5; x++)
{
for(int y = 0; y < 5; y++)
{
min = std::min(temp[x][y], min);
max = std::max(temp[x][y], max);
}
}
答案 2 :(得分:0)
如果将阵列类型更改为
constexpr int n = 5;
constexpr int m = 7;
std::array<int,n*m> ar;
和访问类似
ar[i*n + j]
然后你只需写
auto min = std::min_element(ar.begin(), ar.end());
auto max = std::max_element(ar.begin(), ar.end());
答案 3 :(得分:0)
只需更改结构,就可以使用iterator
int main()
{
int c_array[5] = {};
std::array<int, 5> cpp_array = {};
std::vector<int> cpp_dynarray(5);
auto c_array_begin = std::begin(c_array); // = c_array + 0
auto c_array_end = std::end(c_array); // = c_array + 5
auto cpp_array_begin = std::begin(cpp_array); // = cpp_array.begin()
auto cpp_array_end = std::end(cpp_array); // = cpp_array.end()
auto cpp_dynarray_begin = std::begin(cpp_dynarray); // = cpp_dynarray.begin()
auto cpp_dynarray_end = std::end(cpp_dynarray); // = cpp_dynarray.end()
}
并使用循环:
mypointer = arr;
for(auto it = arr.begin(); it != arr.end(); ++it) {
min = std::min(*mypointer, min)
max = std::max(*mypointer, max)
}