最稳妥的平均值计算是用std::accumulate配合浮点累加和空数组检查:double sum = std::accumulate(arr, arr + n, 0.0); double avg = sum / static_cast(n); 需包含,并提前判断n是否为0。
std::accumulate 求平均值最稳妥直接对 int 数组求平均容易整数截断,必须显式转成浮点类型。推荐用 中的 std::accumulate,它天然支持累加任意数值类型,且避免手写循环出错。
#include 和 #include (若用 std::vector)或
double 接收总和,再除以 static_cast(n)
int arr[] = {1, 2, 3, 4, 5};
size_t n = sizeof(arr) / sizeof(arr[0]);
if (n == 0) return 0.0;
double sum = std::accumulate(arr, arr + n, 0.0); // 0.0 强制使用 double 累加
double avg = sum / n;手动遍历原生数组时,sizeof(arr)/sizeof(arr[0]) 只在数组定义作用域内有效;传入函数后退化为指针,sizeof 就失效了。这时候必须额外传长度参数。
double average(const int* arr, size_t len),不能只靠 arr
while(*p) 判断结尾——数组里可能含 0 元素,会提前终止int sum 累加大数组,易溢出;优先用 long long 或 double
std::vector 的平均值计算更安全相比原生数组,std::vector 自带 .size() 和迭代器,不易出错,且支持范围 for 循环,语义清晰。
begin()/end() 配合 std::accumulate,比下标访问更泛型vector 直接累加无类型转换烦恼;但若存的是 int,仍需初始值设为 0.0
vector::empty() 比 size() == 0 更明确表达意图std::vectorv = {10, 20, 30}; if (v.empty()) return 0.0; double sum = std::accumulate(v.begin(), v.end(), 0.0); double avg = sum / v.size();
如果多个地方要算不同类型的平均值(float、double、long),写模板比重复粘贴代码更可靠。关键点是让累加类型自动推导为足够宽的浮点型。
std::common_type_t 或直接用 double 作累加类型,覆盖大部分场景
vector 迭代器operator+ 和除法语义空数组处理和类型提升这两个点,实际项目里最容易被跳过,一出问题就是静默错误或崩溃。