#include <iostream>
#include <vector>
#include <algorithm>
#include <cctype>
#include <string>
using namespace std;
// 函数对象,用于过滤年龄小于18岁的pair
struct FilterByAge {
bool operator()(const pair<int, string>& p) {
return p.first >= 18;
}
};
// 函数对象,用于将字符串转换为大写
struct ToUpper {
string operator()(const string& s) {
string result = s;
transform(result.begin(), result.end(), result.begin(), [](unsigned char c) {
return toupper(c);
});
return result;
}
};
int main() {
vector<pair<int, string>> people = {
{17, "Alice"},
{20, "Bob"},
{15, "Charlie"},
{25, "David"}
};
// 使用erase - remove_if过滤年龄小于18岁的pair
people.erase(remove_if(people.begin(), people.end(), FilterByAge()), people.end());
// 将剩下的pair中的姓名全部转换为大写形式
transform(people.begin(), people.end(), people.begin(), [](pair<int, string>& p) {
p.second = ToUpper()(p.second);
return p;
});
// 输出处理后的vector
for (const auto& p : people) {
cout << p.first << " " << p.second << endl;
}
return 0;
}
实现思路
- 过滤年龄小于18岁的
pair
:
- 定义一个函数对象
FilterByAge
,重载()
运算符,用于判断pair
中的年龄是否大于等于18岁。
- 使用
erase - remove_if
惯用法,remove_if
算法会将不符合条件(年龄小于18岁)的元素移动到容器末尾,并返回指向新的逻辑末尾的迭代器,erase
方法则删除这些移动到末尾的元素,从而实现过滤。
- 将剩下的
pair
中的姓名全部转换为大写形式:
- 定义一个函数对象
ToUpper
,重载()
运算符,在其中使用<algorithm>
中的transform
和<cctype>
中的toupper
函数将字符串转换为大写形式。
- 再使用
transform
算法,遍历处理后的vector
,对每个pair
中的字符串调用ToUpper
函数对象进行转换。
- 输出处理后的
vector
:
- 使用范围
for
循环遍历处理后的vector
,输出每个pair
中的年龄和转换为大写后的姓名。