auto&&f
leetcode3823,
我的低级写法
class Solution {
public:string reverseByType(string s) {string ans;vector<char>alpha,spec;for(char c:s){if(islower(c)) alpha.push_back(c);else spec.push_back(c);}reverse(alpha.begin(),alpha.end());reverse(spec.begin(),spec.end());int aid = 0,sid = 0;for(char c:s){if(islower(c)) ans += alpha[aid++];else ans += spec[sid++];}return ans;}
};
灵神高级写法
class Solution {//这是C++20的写法,就是用来传递函数/*在早期的 C++ 中,如果想传入一个函数作为参数,代码会写得非常冗长(比如使用函数指针或 std::function)。
这里的 auto&& 是 C++20 的简写函数模板(Abbreviated Function Template)
结合了 万能引用(Universal Reference)。
auto 告诉编译器:“不管传进来的是什么类型的函数(普通函数、Lambda 表达式),请你自动推导”。
&& 保证了无论传进来的是临时对象还是持久对象,都能以最高效的方式(避免拷贝)接收。
总结:这是一种现代 C++ 接收“回调函数”的最精简、最高效的写法。*/void reverse(string& s, auto&& f) {int i = 0;int j = s.size() - 1;while (i < j) {while (i < j && f(s[i])) {i++;}while (i < j && f(s[j])) {j--;}swap(s[i], s[j]);i++;j--;}}public:string reverseByType(string s) {reverse(s, ::islower);reverse(s, [](char ch) { return !islower(ch); });return s;}
};
