泛型算法
可以支持多种类型的算法
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec{1,7,5,3,2};
std::sort(std::begin(vec),std::end(vec));
}
引入泛型算法而不是方法的形式
- 内建数据类型不支持方法
- 计算逻辑存在相似性,避免重复
泛型算法通常来说不复杂,但优化效果足够好
一些泛型算法与方法同名,实现功能类似,一般优先使用方法
例如:std::find VS std::map::find
泛型算法的分类
读算法:给定一个迭代区间,读取其中的元素并进行计算
- accumulate /find/count
写算法:向一个迭代区间写入元素
- 单纯写操作:fill/fill_n
- 读+写操作:transform/copy
- 写操作要注意写入目标区间足够大,不然会造成内存越界
排序算法:
- sort/unique
- 泛型算法使用迭代器实现元素访问
迭代器的分类:
- 输入迭代器<br /> - 输出迭代器<br /> - 前向迭代器<br /> - 双向迭代器<br /> - 随机访问迭代器
一些算法会根据迭代器类别的不同引入相应的优化:例如distance 算法
Lambda 表达式
捕获
针对函数体中使用的局部自动对象进行捕获
#include <iostream>
int main()
{
int y = 10;// 这里如果改为static int y = 10; 编译错误
auto x = [y] (int val) {return val > y;}; // 捕获
std::cout << x(2) << std::endl;
}
值捕获、引用捕获以及混合捕获
#include <iostream>
int main()
{
int y = 10;
int z = 3;
auto x = [&y,z] (int val) {++y;return val > z;}; // 捕获 [=] 值捕获 [&] 引用捕获
std::cout << x(5) << std::endl;
std::cout << y << std::endl;
}
this捕获
#include <iostream>
struct Str
{
auto fun()
{
int val = 3;
auto lam = [val,this] ()
{
return val > x;
};
}
int x;
};
int main()
{
Str s{};
s.fun();
}
初始化捕获(C++14)
int main()
{
int x = 3;
auto lam = [y = x] (int val)
{
return val > y;
};
std::cout << lam(100) << std::endl;
}
特殊:
int main()
{
int x = 3;
auto lam = [x = x] (int val)
{
return val > x;//右边的x
};
std::cout << lam(100) << std::endl;
}
this捕获(C++17)
解决this指针不安全的问题
*说明符(mutable / constexpr (C++17) / consteval (C++20)……)
#include <iostream>
int main()
{
int y = 10;
auto lam = [y] (int val)mutable
{
++y;
return val > y;
};
std::cout << lam(33) << std::endl;
}
模板形参 (C++20)
#include <iostream>
int main()
{
auto lam = [] <typename T> (T val) consteval
{
return val + 1;
};
constexpr int val = lam(100);
std::cout << val << std::endl;
}
lambda表达式的深入应用
int main() { int x = 3; int y = 5; auto lam = [z = x + y] () { return z; }; std::cout << lam() << std::endl; }
- 即调用函数表达式(Immediately-Invoked Function Expression, IIFE )
```cpp
#include <iostream>
int main()
{
int x = 3;
int y = 5;
const auto val = [z = x + y] ()
{
return z;
}();
std::cout << val << std::endl;
}
auto fun(int val) { return val + 10; }
auto fun(double val) { return val + 1; }
int main() { auto lam = [] (auto x) { return fun(x); }; std::cout << lam(3) << std::endl; std::cout << lam(3.5) << std::endl; }
- 递归调用(C++14 )
```cpp
#include <iostream>
int main()
{
auto factorial = [] (int n)
{
auto f_impl = [] (int n ,const auto& impl) -> int
{
return n > 1 ? n * impl(n - 1,impl) : 1;
};
return f_impl(n, f_impl);
};
std::cout << factorial(5) << std::endl;
}