DevCN
菜单
全部文章快讯开发深度热点

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。是否将零分钟计入平均值,应在数据契约里明确。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。