用C++计算平均值需将sum转为浮点型再除,如static_cast<double>(sum)/n;空容器须先检查v.empty();大数和用long long防溢出。

怎么用 C++ 计算平均值?注意整数除法陷阱
平均值就是所有数之和除以个数,但 int 类型相除会截断小数——这是新手最常踩的坑。必须至少有一个操作数是浮点类型,否则 sum / n 永远得不到小数部分。
- 推荐写法:
static_cast<double>(sum) / n</double>,显式转换更安全 - 如果输入本身就是
vector<double></double>,直接求和再除即可 - 空容器必须提前检查,否则除零会崩溃;建议先判断
v.empty() - 累加时注意溢出:大整数用
long long存和,比int更稳妥
中位数要先排序,vector::size() 返回 size_t 类型
中位数依赖有序序列,C++ 没有内置“取中位数”函数,必须手动排序后取中间位置。关键是索引计算——size() 返回的是 size_t(无符号),直接减 1 或做除法时容易隐式转换出错。
- 排序用
std::sort(v.begin(), v.end()),别忘了#include <algorithm> - 奇数个:索引
v.size() / 2(整除刚好是中间) - 偶数个:取
v[v.size()/2 - 1]和v[v.size()/2]的平均值,这里v.size()/2 - 1要确保不为负——所以必须先判空且v.size() >= 2 - 别用
int mid = v.size() / 2,size_t到int可能截断(虽然一般不会),稳妥写法是auto mid = v.size() / 2
众数没有标准库实现,得自己统计频次
C++ 标准库没有 mode() 这种函数,得靠 std::map 或 std::unordered_map 统计每个值出现次数。难点不在统计,而在处理多个众数、或所有数频次相同的情况。
- 用
std::unordered_map<T, int>记录频次,插入时用freq[x]++ - 遍历 map 找最大频次
max_count,再遍历一次收集所有频次等于max_count的值——这就是众数集合 - 如果所有数只出现一次,那每个数都是众数;按题目要求,可能需要返回空、首个、或全部,得看具体需求
- 注意:浮点数不适合作为 map 的 key(精度问题),整数或字符串更稳妥;若必须用 float/double,建议转成整型倍数或用自定义哈希
把三者打包成函数时,别忽略输入有效性校验
实际调用时,没人会保证传进来的 vector 非空、类型一致、数值合理。一个健壮的接口得在最外层就拦住明显异常。
立即学习“C++免费学习笔记(深入)”;
- 空输入应明确报错或返回
std::nullopt(C++17)、或用std::optional<double>包装结果 - 中位数对数据类型敏感:整型 vector 算出的中位数可能是小数,返回类型建议统一用
double - 众数结果可能是多个值,返回
std::vector<T>比单个值更通用 - 性能上,排序是瓶颈(O(n log n)),频次统计是 O(n),平均值是 O(n);如果数据流式到达,就不能一次性排序,得换在线算法
三个统计量看似简单,但类型、边界、空值、多解——每个环节都藏着隐性假设。写完别急着交,拿 {1,1,2,2}、{}、{5} 这几组数据跑一遍,基本就能暴露大部分问题。


















