C++ 入门:用 vector 与范围循环统计学习时长
用 vector 管理记录集合,通过范围循环过滤负值并累计总时长,理解元素副本、有效条数和空集合行为。
本节目标
用 vector 管理记录集合,通过范围循环过滤负值并累计总时长,理解元素副本、有效条数和空集合行为。
环境与运行方法
使用 C++17 编译器,保存为 lesson.cpp,执行 c++ -std=c++17 -Wall -Wextra -Werror lesson.cpp -o lesson 后运行 ./lesson。以下仅使用标准库。
核心思路
vector 管理连续元素存储,普通记录集合无需手动 new 和 delete。范围循环适合不依赖下标的读取,累计变量必须显式初始化。本例把零分钟视为有效记录,负数才会被忽略。
完整示例
#include <iostream>
#include <vector>
int main() {
std::vector<int> minutes{20, -1, 40, 0};
long total = 0;
std::size_t valid = 0;
for (int value : minutes) {
if (value < 0) continue;
total += value;
++valid;
}
std::cout << "valid=" << valid << " total=" << total << '\n';
}预期输出
valid=3 total=60逐步理解
四条输入中只有 -1 被跳过,零仍增加有效条数。这里 value 是 int 副本,修改它不会改动 vector 中的元素。要原地修改时才使用引用,并先说明修改输入的必要性。
对昂贵对象的只读遍历可考虑 const 引用,简单整数无需为了避免复制增加复杂度。遇到空容器循环不执行,已初始化的累计变量给出确定结果。
常见问题与边界
- 遍历时追加元素可能导致迭代器失效。
- 有效条数不是达标条数。
- 大量数值相加需要评估整数上限。
动手练习
把输入改为空,再改成 {30,30}。
参考答案
空集合输出 valid=0 total=0;两个 30 输出 valid=2 total=60。是否将零分钟计入平均值,应在数据契约里明确。
文章回复
0 条公开回复