8.1 排序与 lambda
答:______________
✅ 查看答案与解析
答案 对
解析:list 只有双向迭代器,要排序用它的成员函数 l.sort()。
答:______________
✅ 查看答案与解析
答案 对
解析:[&] 引用捕获,[=] 值捕获,[x] 只捕获 x,[] 不捕获。引用捕获能修改外部变量。
true
false
随便
抛出异常
答:______________
✅ 查看答案与解析
答案 B
解析:严格弱序要求相等时返回 false。写成 a.score >= b.score 会让 sort 行为未定义。
std::sort(v.begin(), v.end(),
[](const Student& a, const Student& b) {
return a.score >= b.score; // 相等时返回 true,破坏严格弱序
});
✅ 查看答案与解析
答案 return a.score > b.score; // 相等时返回 false
解析:严格弱序:相等必须 false。>= 会导致 sort 段错误或元素丢失。
提示:lambda 里先比 score,相等再比 name。
✅ 查看答案与解析
答案 参考答案:
解析:比较器必须是严格弱序;lambda 就近写比较规则比具名函数省事。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
struct Student { std::string name; int score; };
int main() {
std::vector<Student> v{{"Ann", 90}, {"Bob", 95}, {"Cid", 90}};
std::sort(v.begin(), v.end(), [](const Student& a, const Student& b) {
if (a.score != b.score) { return a.score > b.score; }
return a.name < b.name;
});
for (const auto& s : v) { std::cout << s.name << ' ' << s.score << '\n'; }
return 0;
}
// 输出:Bob 95 / Ann 90 / Cid 908.2 erase-remove 与二分查找
答:______________
✅ 查看答案与解析
答案 对
解析:std::remove 名字有误导性:真正删除要靠 v.erase(remove(...), v.end()) 组合。
第一个 > x 的位置
第一个 >= x 的位置
x 出现的次数
最后一个 x 的位置
答:______________
✅ 查看答案与解析
答案 B
解析:lower_bound 找第一个不小于 x(左边界);upper_bound 找第一个大于 x(右边界后一位)。
x 在数组中出现的次数
数组长度
x 的下标
x 的平方
答:______________
✅ 查看答案与解析
答案 A
解析:两个迭代器相减就是 x 的出现次数。
std::vector<int> v{1, 2, 3, 2, 4};
std::remove(v.begin(), v.end(), 2); // 只是挪动元素,size 没变
✅ 查看答案与解析
答案 v.erase(std::remove(v.begin(), v.end(), 2), v.end());
解析:erase-remove 惯用法:remove 把保留元素前移并返回新逻辑结尾,erase 从那里删到真正末尾。
提示:删除用 v.erase(std::remove_if(...), v.end())。
✅ 查看答案与解析
答案 参考答案:
解析:remove_if 按条件前移;迭代器相减得下标。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<int> v(n);
for (int i = 0; i < n; ++i) { std::cin >> v[i]; }
v.erase(std::remove_if(v.begin(), v.end(),
[](int x) { return x % 2 == 0; }), v.end());
std::sort(v.begin(), v.end());
auto it = std::lower_bound(v.begin(), v.end(), 3);
if (it == v.end()) { std::cout << -1 << '\n'; }
else { std::cout << (it - v.begin()) << '\n'; }
return 0;
}