C++ FOUNDATION · ARRAYS & VECTOR

让下标
替你记住

数组标记与 vector 课堂代码详解

把“计数、覆盖、最值、筛选”拆成可迁移的解题动作。先看懂数据如何流动,再记住模板。

05 道例题04 类模板01 组在线练习
01 / CONCEPT MAP

先建立一张
解题地图

数组下标

表示“谁”

分数、坐标、种类、字符都可以映射成下标。

cnt[t]++
数组元素

记录“状态”

出现几次、是否覆盖、当前最低价,都由元素值表达。

a[i] = 1
vector

收集“结果”

不知道会留下多少项时,让动态数组按需扩展。

a.push_back(t)
统一心法现实对象→下标映射→更新状态→遍历答案
02 / FIVE LESSONS

五道题,四种
核心动作

桶计数

分数统计

把分数当作桶编号,桶里的数字就是人数。

int cnt[1010] = {}, n, m, t;
cin >> n >> m;
for(int i = 1; i <= n; i++){
    cin >> t;
    cnt[t]++;
}
for(int i = 0; i <= m; i++)
    cout << cnt[i] << " ";

关键cnt[t]++:用值作下标,对应计数加 1。

易错数组必须 = {} 清零;输出要写 i <= m,不能漏掉满分。

覆盖标记

区间覆盖长度

重叠位置只算一次,所以“标记为 1”,而不是反复累加。

int n, l, r, a[10010] = {};
cin >> n;
while(n--){
    cin >> l >> r;
    for(int i = l; i <= r; i++) a[i] = 1;
}
int cnt = 0;
for(int i = 0; i <= 10000; i++)
    if(a[i] == 1) cnt++;

关键a[i] = 1 表示位置已经覆盖,多次覆盖状态仍是 1。

易错不要直接相加各区间长度,否则重叠部分会被重复计算。

最小值追踪

小杨的智慧购物

每类文具只保留目前见过的最低价格。

int a[100010] = {}, m, n;
cin >> m >> n;
for(int i = 1; i <= n; i++){
    int k, p; cin >> k >> p;
    if(a[k] == 0 || a[k] > p) a[k] = p;
}
int sum = 0;
for(int i = 1; i <= m; i++) sum += a[i];

关键a[k] == 0 处理第一次遇到;之后只接受更低价格。

易错若只判断 a[k] > p,初值 0 永远不会被正价格更新。

字符计数

出现最多的字符

字符也能映射成下标;相同次数时,保留最后出现者。

int cnt[130] = {};
for(int i = 0; i < s.size(); i++)
    cnt[s[i]]++;
int maxn = -1e9; char res;
for(int i = 0; i < s.size(); i++){
    if(cnt[s[i]] >= maxn){
        maxn = cnt[s[i]]; res = s[i];
    }
}

关键>= 让后遇到的同频字符覆盖前者;> 则会保留第一个。

对比ASCII 写法更通用;ch-'a' 只适合纯小写字母,但更省空间。

动态收集

输出奇数

边读边筛选,把需要的结果按原顺序放进 vector。

vector<int> a;
for(int i = 0; i < n; i++){
    cin >> t;
    if(t % 2 != 0) a.push_back(t);
}
bool first = true;
for(int x : a){
    if(!first) cout << ",";
    cout << x; first = false;
}

关键push_back 动态追加;first 避免首尾多出逗号。

易错判断奇数用 t % 2 != 0,才能正确包含负奇数。

03 / VECTOR BASICS

动态数组的
一生

CREATEvector<int> v;

空容器,size 为 0

→
GROWv.push_back(10);

尾部添加,自动扩容

→
SHRINKv.pop_back();

删除末项,非空时使用

→
RESETv.clear();

清空元素,容量可能保留

三种初始化vector<int> v1;vector<int> v2(5);vector<int> v3(5, 8);空 / 5 个 0 / 5 个 8
04 / PATTERN LIBRARY

看见题型,
唤醒模板

01

桶计数

cnt[value]++;

值域较小,要求频次统计。

02

覆盖标记

a[position] = 1;

只关心“是否出现/覆盖”。

03

最值追踪

best = min(best, x);

扫描过程中只保留当前最优。

04

动态收集

v.push_back(x);

结果数量未知,且需保留顺序。

05 / PRACTICE LAB

在线练习

选择课堂题目,修改输入,点击运行。这里用与讲义代码相同的逻辑在浏览器中模拟结果,适合验证思路与边界。

score.cppGCC 13.2 · C++17
输出 / OUTPUTREADY
等待运行…


源代码可直接修改;运行时由在线 GCC 沙箱编译,勿提交隐私信息。