重载 operator<< 求二维数组的总和
Overload operator<< for finding sum of 2 D array
我正在用 C++ 做一些练习题。我 运行 遇到了一个问题,我想找到 2d 数组 的元素总和。我可以写一个 get sum 方法,其中 returns 总和。但我正在探索是否可以重载“operator<<
”方法以获得相同的结果。
#include <iostream>
using namespace std;
int operator<<(const int arr[5][5])
{
int sum = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
sum += arr[i][j];
}
}
return sum;
}
int main()
{
int arr[5][5] = { {1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9} };
cout << &arr << endl;
}
我想像 std::cout
方法那样求和。这可能吗?
您可以通过为 operator<<
提供模板重载来获得所需的输出,该模板重载采用 const& int[row][col]
,如下所示。
这仅适用于 int[row][col]
.
#include <iostream>
#include <numeric> // std::accumulate
template<std::size_t M, std::size_t N>
std::ostream& operator<<(std::ostream& out, const int (&arr)[M][N]) /* noexcept */
{
int sum = 0;
for (std::size_t i = 0; i < M; ++i)
{
#if false // either using `std::accumulate`
sum += std::accumulate(arr[i], arr[i] + N, 0);
#elif true // or using for- loop
for (std::size_t j = 0; j < N; j++)
sum += arr[i][j];
#endif
}
return out << sum;
}
旁注:
- 但是,您正在更改 'operator<<' 重载的行为。它
假设打印元素(即数组)而不是打印的总和
元素。
- 也避免练习
using namespace std;
。
使用std::accumulate,由于数组中的内存是线性的,你可以使用数组的开始和结束作为迭代器。
#include <iostream>
#include <numeric>
int main()
{
int arr[5][5] = { {1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9} };
int sum = 0;
sum += std::accumulate(arr[0], arr[0]+sizeof(arr)/sizeof(arr[0][0]), 0);
std::cout << "Sum of array arr[5][5]: " << sum << "\n";
}
我正在用 C++ 做一些练习题。我 运行 遇到了一个问题,我想找到 2d 数组 的元素总和。我可以写一个 get sum 方法,其中 returns 总和。但我正在探索是否可以重载“operator<<
”方法以获得相同的结果。
#include <iostream>
using namespace std;
int operator<<(const int arr[5][5])
{
int sum = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
sum += arr[i][j];
}
}
return sum;
}
int main()
{
int arr[5][5] = { {1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9} };
cout << &arr << endl;
}
我想像 std::cout
方法那样求和。这可能吗?
您可以通过为 operator<<
提供模板重载来获得所需的输出,该模板重载采用 const& int[row][col]
,如下所示。
这仅适用于 int[row][col]
.
#include <iostream>
#include <numeric> // std::accumulate
template<std::size_t M, std::size_t N>
std::ostream& operator<<(std::ostream& out, const int (&arr)[M][N]) /* noexcept */
{
int sum = 0;
for (std::size_t i = 0; i < M; ++i)
{
#if false // either using `std::accumulate`
sum += std::accumulate(arr[i], arr[i] + N, 0);
#elif true // or using for- loop
for (std::size_t j = 0; j < N; j++)
sum += arr[i][j];
#endif
}
return out << sum;
}
旁注:
- 但是,您正在更改 'operator<<' 重载的行为。它 假设打印元素(即数组)而不是打印的总和 元素。
- 也避免练习
using namespace std;
。
使用std::accumulate,由于数组中的内存是线性的,你可以使用数组的开始和结束作为迭代器。
#include <iostream>
#include <numeric>
int main()
{
int arr[5][5] = { {1,2,3,4,5},
{2,3,4,5,6},
{3,4,5,6,7},
{4,5,6,7,8},
{5,6,7,8,9} };
int sum = 0;
sum += std::accumulate(arr[0], arr[0]+sizeof(arr)/sizeof(arr[0][0]), 0);
std::cout << "Sum of array arr[5][5]: " << sum << "\n";
}