c++ - 检查一个字符是否在字符串中至少出现 N 次。算法中的任何解决方案?
问题描述
这个问题在获得解决方案方面并不难,但我想知道是否有任何 C++ 函数或算法可以解决它。
我在处理这个问题时想到了这个问题Count character occurrences in a string in C++
所以想知道除了从头开始编写一个函数来检查字符串中是否存在特定数量的字符之外,我们是否还有其他选择。例如让我们说:
std::string s = "a_b_c_d_e_f_g_h_i_j_k_l_m";
我们想找出字符串中是否至少有 2 个 '_'。如果我们使用std::count
它将返回所有 '_' 的计数。std::count_if
也会以类似的方式表现。我可以编写一个代码来循环遍历字符串并在计数达到 2 时立即中断,但我想知道我们是否在 C++ 算法或函数中有一些现有的解决方案。
这里的思考过程是,如果我们得到一个很长的字符串作为输入,并且做某事的标准是基于特定字符是否至少出现 n 次,那么遍历整个字符串是一种浪费。
解决方案
std::find_if
使用适当的函子就可以完成这项工作:
std::string s1 = "a_b_c_d_e_f_g_h_i_j_k_l_m";
int count = 0;
bool found =
std::find_if(s1.begin(), s1.end(),
[&count] (char c) {
return c == '_' && ++count == 2;
}) != s1.end();
不过,我更愿意为此创建一个新函数,我们称之为find_if_n
:
template<typename Iterator, typename Predicate>
Iterator find_if_n(Iterator begin, Iterator end, Predicate&& pred, int n) {
return std::find_if(begin, end,
[&pred, &n] (const auto& v) {
return pred(v) && --n == 0;
});
}
使用更简单:
bool found = find_if_n(s1.begin(), s1.end(), [] (char c) {
return c == '_';
}, 2) != s1.end();
推荐阅读
- jwt - 如何使用 JWT 正确验证 Quarkus / smallyre-JWT 的 openapi UI?
- node.js - 如何使用来自 GCP Firestore 的大量数据在 Vue.js 数据表中工作
- r - 无法在 R 版本 4.1.0 上使用 timetk 将双向量转换为函数
- javascript - 这可以成为 Javascript 中高阶组件的示例吗?
- php - 如何从复选框创建一个数组
- ios - Flutter 音频播放器声音延迟
- ios - UINavigationController 过渡到 defaultBackground 显示白色边框
- salesforce - Salesforce 闪电文件上传
- c# - 日期时间的人性化器
- asp.net-core - 如何更改 asp.netcore 3.1 的默认登录路径