本文最后更新于538 天前,其中的信息可能已经过时,如有错误请发送邮件到898599301@qq.com
使用c++11新特性:any_of
1.1函数原型:
template<class InputIt, class UnaryPredicate>
bool any_of(InputIt first, InputIt last, UnaryPredicate p);
参数解释
- InputIt first:
- 这是输入范围的起始迭代器,指向要检查的第一个元素。
- InputIt last:
- 这是输入范围的结束迭代器,指向要检查的最后一个元素之后的位置(即范围是
[first, last))。
- UnaryPredicate p:
- 这是一个一元谓词函数或函数对象,用于对范围内的每个元素进行检查。谓词函数接受一个元素作为参数,并返回一个布尔值,表示该元素是否满足特定条件。
关于第三个参数的使用
- 使用标准库函数:
- 使用 lambda 表达式:
- 使用函数指针:
- 使用函数对象:
返回值
- 如果范围内至少有一个元素满足谓词函数
p,则返回true。 - 否则,返回
false
1.2参数示例
#include <iostream>
#include <vector>
#include <algorithm> // 包含 any_of
#include <cctype> // 包含 isdigit 和 isalpha
using namespace std;
// 自定义函数对象
struct IsSpecialChar {
bool operator()(char c) const {
return !isalnum(c); // 非字母和数字的字符即为特殊字符
}
};
// 自定义函数
bool isSpecialChar(char c) {
return !isalnum(c);
}
int main() {
string str = "Hello123!";
// 使用标准库函数
bool hasDigit = any_of(str.begin(), str.end(), ::isdigit);
if (hasDigit) {
cout << "String contains a digit." << endl;
} else {
cout << "String does not contain any digit." << endl;
}
// 使用 lambda 表达式
bool hasAlpha = any_of(str.begin(), str.end(), [](char c) {
return isalpha(c);
});
if (hasAlpha) {
cout << "String contains a letter." << endl;
} else {
cout << "String does not contain any letter." << endl;
}
// 使用函数指针
bool hasSpecialChar1 = any_of(str.begin(), str.end(), isSpecialChar);
if (hasSpecialChar1) {
cout << "String contains a special character (using function pointer)." << endl;
} else {
cout << "String does not contain any special character (using function pointer)." << endl;
}
// 使用函数对象
bool hasSpecialChar2 = any_of(str.begin(), str.end(), IsSpecialChar());
if (hasSpecialChar2) {
cout << "String contains a special character (using function object)." << endl;
} else {
cout << "String does not contain any special character (using function object)." << endl;
}
return 0;
}
1.3题目示例
根据复杂程度不同,密码安全度被分为高、中、低三档。
- 高:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,同一个字符出现不超过 2 次;
- 中:由上述 64 种字符组成,长度大于等于 6 个字符,包含字母、数字和特殊字符,且未达到高安全度要求;
- 低:由上述 64 种字符组成,长度大于等于 6 个字符,且未达到中安全度要求;
小 P 为自己准备了 n 个候选密码,试编写程序帮小 P 自动判别每个密码的安全级别。保证这 nn 个密码都至少满足低安全度要求,当安全度为高、中、低时分别输出 2、1、0 即可。
输入
- 从标准输入读入数据。
- 输入共 n+1 行。
- 第一行包含一个正整数 n,表示待判别的密码个数;
- 接下来 n 行,每行一个字符串,表示一个安全度至少为低的候选密码。
输出
- 输出到标准输出。
- 输出共 n 行,每行输出一个整数
2、1或0,表示对应密码的安全度。
代码
#include <bits/stdc++.h>
using namespace std;
// 判断字符串是否符合特定条件
int judge(string s) {
// 检查字符串是否包含 '#' 或 '*',并且包含数字和字母
if ((s.find("#") != string::npos || s.find("*") != string::npos) &&
any_of(s.begin(), s.end(), ::isdigit) &&
any_of(s.begin(), s.end(), ::isalpha)) {
// 检查字符串中是否有任何字符出现超过两次
for (int i = 0; i < s.size(); i++) {
if (count(s.begin(), s.end(), s[i]) > 2)
return 1; // 如果有字符出现超过两次,返回 1
}
return 2; // 如果没有字符出现超过两次,返回 2
} else {
return 0; // 如果不符合包含 '#' 或 '*',数字和字母的条件,返回 0
}
}
int main(int argc, char const *argv[]) {
int n;
cin >> n; // 读取需要判断的字符串总数
string str;
while (n--) {
cin >> str; // 读取需要判断的字符串
cout << judge(str) << endl; // 输出判断结果
}
return 0;
}
题目来源:TUOJ