查找成绩(向量实现)
题目描述
# T432283 05-30-B01-查找成绩(向量实现)(L4)
## 题目描述
输入一组成绩,共n个,这n个成绩的序号为1~n。再查找成绩a,输出每个成绩a的位置。要求用向量实现。
注意,本题需要用向量的find()函数,find()函数返回的不是元素的下标,而是元素的迭代器。
## 输入格式
输入数据第一行为正整数n,n≤100。第二行有n个整数,范围为0~100,用空格隔开。第三行有一个成绩a,范围为0~100。
## 输出格式
输出成绩a的每个位置,用空格隔开。如果查找不到成绩a,输出no。
## 输入输出样例 #1
### 输入 #1
```
8
90 88 85 88 88 98 95 100
88
```
### 输出 #1
```
2 4 5
```
## 输入输出样例 #2
### 输入 #2
```
8
90 88 85 88 88 98 95 100
99
```
### 输出 #2
```
no
```
## 说明/提示
### 本题出处
本题源自以下教材的编程习题:王桂平, 周祖松, 穆云波, 葛昌威编著. C++趣味编程及算法入门. 北京大学出版社, 2024年出版.
一、题目分析
题目要求输入n
个成绩,用向量(vector
)存储,然后查找目标成绩a
,输出所有a
对应的位置(位置从 1 开始)。若未找到,输出no
。核心要求是必须使用向量的find()
函数,且需注意find()
返回的是迭代器而非下标。
二、核心知识点
- 向量(
vector
):动态数组,可存储多个同类型元素,支持下标访问和迭代器操作。 find()
函数:位于<algorithm>
头文件中,用于在容器中查找指定元素。- 语法:
find(开始迭代器, 结束迭代器, 目标值)
- 返回值:若找到,返回指向该元素的迭代器;若未找到,返回结束迭代器(如
vector.end()
)。
- 语法:
- 迭代器:类似指针,用于访问容器元素。通过迭代器差值可计算元素下标(
迭代器 - 开始迭代器 = 下标
)。
三、代码实现步骤详解
1. 引入头文件
cpp
运行
#include <iostream> // 输入输出流
#include <vector> // 向量容器
#include <algorithm> // 包含find()函数
using namespace std; // 简化命名空间
2. 读取输入数据
cpp
运行
int n, a; // n:成绩个数;a:目标成绩
cin >> n; // 读取nvector<int> s(n); // 定义大小为n的向量s,存储成绩
for (int i = 0; i < n; i++) {cin >> s[i]; // 循环读取n个成绩,存入向量(下标0~n-1)
}cin >> a; // 读取目标成绩a
3. 查找并输出位置
cpp
运行
auto it = s.begin(); // 定义迭代器it,初始指向向量第一个元素
bool found = false; // 标记是否找到目标成绩,初始为false// 循环查找:每次从当前it位置开始,找到后更新it到下一个位置
while ((it = find(it, s.end(), a)) != s.end()) {// 若不是第一次输出,先输出空格(避免结尾多空格)if (found) cout << " ";// 计算位置:迭代器差值(下标)+1(位置从1开始)cout << (it - s.begin() + 1);found = true; // 标记为已找到it++; // 移动迭代器到下一个位置,避免重复查找当前元素
}// 若未找到,输出"no"
if (!found) {cout << "no";
}
四、关键逻辑解析
-
迭代器与下标转换:向量元素的下标从 0 开始,而题目要求位置从 1 开始。通过
it - s.begin()
可得到元素的下标(如it
指向第 2 个元素时,it - s.begin() = 1
),加 1 后即为题目要求的位置。 -
循环查找逻辑:
- 第一次查找从
s.begin()
开始,找到后通过it++
将迭代器移动到下一个元素,确保下次从新位置开始查找。 - 若
find()
返回s.end()
,说明已遍历完所有元素且未找到,循环结束。
- 第一次查找从
-
输出格式控制:用
found
标志判断是否为第一次输出。第一次输出直接打印位置,后续输出前先加空格,避免结尾出现多余空格(如样例 1 输出2 4 5
,中间有空格,结尾无空格)。
五、示例测试
样例 1 输入:
plaintext
8
90 88 85 88 88 98 95 100
88
- 向量
s
中的元素为[90,88,85,88,88,98,95,100]
(下标 0~7)。 - 第一次查找:
find
从begin()
开始,找到下标 1 的 88,位置为1+1=2
,it
移动到下标 2。 - 第二次查找:
find
从下标 2 开始,找到下标 3 的 88,位置为3+1=4
,it
移动到下标 4。 - 第三次查找:
find
从下标 4 开始,找到下标 4 的 88,位置为4+1=5
,it
移动到下标 5。 - 后续查找无结果,循环结束。最终输出
2 4 5
。
样例 2 输入:
plaintext
8
90 88 85 88 88 98 95 100
99
- 向量中无 99,
find
始终返回end()
,found
保持 false,最终输出no
。
六、完整代码
cpp
运行
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int n, a;cin >> n;vector<int> s(n);for (int i = 0; i < n; i++) {cin >> s[i];}cin >> a;auto it = s.begin();bool found = false;while ((it = find(it, s.end(), a)) != s.end()) {if (found) cout << " ";cout << (it - s.begin() + 1);found = true;it++;}if (!found) {cout << "no";}return 0;
}
大家还可以在我的bilibili(编程题小白日记)搜索 ···0053.查找成绩(向量实现)··· 找到这道题的视频解析