C++ 泛型算法
QQ : 1841545843
邮箱 : jiaxx903@163.com
- 大多数算法定义在 algorithm 中, numeric 中定义了一组数值泛型算法。
- find 前两个参数是迭代器的范围,第三个参数是值。
- 算法永远不会执行容器的操作,他们只会运行于迭代器之上,算法永远不会改变底层容器的大小。
只读算法
- find
- count
- accumulate (在头文件 numeric 中) ,
// 前两个参数指出需要求和的元素的范围, 第三个参数是和的初值
int sum = accumulate (vec.cbegin(), vec.cend(), 0);
- 连接 string 的时候需要 将默认值强制转为string : string("");
- 对于只读取的算法,通常最好使用 cbegin(), cend().
- equal 用于确定两个序列是否保存相同的值,
equal(c1.cbegin(), c1.cend(), c2.cbengin()); // c2长度至少与c1一样长
写容器算法
- fill 接受一个迭代器范围和第三个参数,然后将第三个参数写入这个迭代器范围。
- fill_n 接受一个单迭代器, 一个计数值和一个值,
fill_n(vec.begin(), vec.size(), 0) // 注意操作不能超过元素范围个数
- back_inserter 插入迭代器,向容器中添加元素的迭代器。
back_inserter 接受一个指向容器的引用, 返回一个与该容器绑定的迭代器
auto it = back_inserter(vec);
*it = 42;
copy 接受三个迭代器,前两个表示一个输入范围,第三个表示目的序列的起始位置
auto ret = copy(begin(a1), end(a2), a2); // 把a1的内容考3给a2
copy 返回的是其目的位置迭代器的值,即ret 指向a2末尾之后的元素
replace 读入以一个序列,并将其中的等于给定的值全部替换为另一个值
replace(ilist.begin(), ilist.end(), 0, 42) // 将所有的 0 替换成 42
sort 重排序列中的元素的值。
unique 使不重复的元素出现在vector开始部分,返回指向不重复区域之后一个位置的迭代器
\向算法传递函数
sort 接受第三个参数,此参数是一个谓词
谓词是一个可调用的表达式,其返回结果是一个能用作条件的值
bool isShorter(const string &s1, const string &s2)
{
return s1.size() < s2.size();
}
sort(words.begin(), words.end(), isShorter);
stable_sort 这种排序算法维持相等元素的原有顺序
elimDups 按字典序列排序,删除重复元素
find_if 接受三个参数,前两个为范围,第三个为谓词
lambda 表达式
一个lambda表达式表示一个可调用的代码单元,相当于一个未命名的内联函数
auto f = [] {return 42}
[] (const string &a, const string &b)
{
retrun a.size() < b.size();
}
stable_sort(
words.begin(),
words.end(),
[] (const string &a, const string &b)
{
retrun a.size() < b.size();
};
)
[sz] (const string &a) // lambda会捕获sz, 并只有单一的string参数。
{ return a.size() >= az; };
lambda 以一对[]开始,我们可以在其中提供一个以逗号分隔的名字列表
for_each 此算法接受一个可调用对象,并对输入序列中每个元素调用此对象
for_each(wc, words.end(),
[](const string &s)
{cout << s << " ";}
);
– 完整程序
void biggies(vector<string> &words,
vector<string>::size_type sz)
{
}
[] 空捕获列表
[names] 名字列表
[&] 隐式捕获列表, 引用捕获
[=] 隐式捕获列表,值捕获
[&, identifier_list]
[=, identifier_list]
对于值拷贝的变量,lambda不会改变其值,若希望改变捕获的变量的值,
在其参数列表首加上关键字 mutable
auto f = [v1] () mutable {return ++v1;};
指定lambda表达式的返回值
[] (int i) -> int
( — ?;