用 std::vector 存成绩更安全:需包含<vector>和<algorithm>,声明为std::vector<int>,用push_back()输入,空时检查再求平均,用max_element/min_element找极值,编译须加-std=c++11。

用 std::vector 存成绩比数组更安全
新手常直接写 int scores[100],但实际输入可能少于或多于 100 个,越界或浪费空间。用 std::vector 动态存,输入几个就存几个,不用预估大小。
关键点:
- 头文件别漏:
#include <vector> - 声明写成
std::vector<int> scores;,不是vector<int> scores;(除非写了using std::vector;) - 读入时用
scores.push_back(x),别用下标赋值——此时 vector 还是空的,scores[0] = x是未定义行为
求平均值前必须检查是否为空
vector.empty() 返回 true 时,scores.size() 是 0,直接除会崩溃或得到 inf/nan。这不是“小概率”,而是用户按回车就结束输入时的常见情况。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 加一句
if (scores.empty()) { std::cout << "无成绩数据\n"; return 1; } - 求和用
long long sum = 0;防止 int 溢出(比如 100 个 100 分,总和 10000,还安全;但 10000 个 1000 分就超了int) - 平均值转
double:写成static_cast<double>(sum) / scores.size(),避免整数除法截断
找最高分/最低分别用 std::max_element 和 std::min_element
新手容易手写循环比大小,能跑,但易错(比如初始值设成 0,而所有成绩都是负数)。标准库函数更可靠,且一行搞定。
注意细节:
- 头文件要加
#include <algorithm> - 返回的是迭代器,不是值:
auto it_max = std::max_element(scores.begin(), scores.end()); - 取值要解引用:
*it_max,不能直接用it_max - 同样要先判空,否则
begin() == end()时调用会 UB
编译时别忘加 -std=c++11 或更高
用 auto、std::vector::push_back 等特性在老式编译器(如默认 CentOS 7 的 g++ 4.8.5)里不支持,会报错类似:error: 'auto' not allowed in function parameter 或找不到 max_element 重载。
验证方法:
- 命令行编译写全:
g++ -std=c++11 -o score score.cpp - Clang 用户同理:
clang++ -std=c++11 - VS Code + CMake 用户,在
CMakeLists.txt里加set(CMAKE_CXX_STANDARD 11)
没加这个标志,哪怕代码逻辑全对,也根本跑不起来——这点比语法错误更隐蔽,新手最容易卡在这儿。


















