C++ 泛型算法

C++ 泛型算法

QQ : 1841545843
邮箱 : jiaxx903@163.com

  1. 大多数算法定义在 algorithm 中, numeric 中定义了一组数值泛型算法。
  2. find 前两个参数是迭代器的范围,第三个参数是值。
  3. 算法永远不会执行容器的操作,他们只会运行于迭代器之上,算法永远不会改变底层容器的大小。

只读算法

  1. find
  2. count
  3. accumulate (在头文件 numeric 中) ,
// 前两个参数指出需要求和的元素的范围, 第三个参数是和的初值
int sum = accumulate (vec.cbegin(), vec.cend(), 0);

  • 连接 string 的时候需要 将默认值强制转为string : string("");
  1. 对于只读取的算法,通常最好使用 cbegin(), cend().
  2. equal 用于确定两个序列是否保存相同的值,
equal(c1.cbegin(), c1.cend(), c2.cbengin());   //  c2长度至少与c1一样长

写容器算法

  1. fill 接受一个迭代器范围和第三个参数,然后将第三个参数写入这个迭代器范围。
  2. fill_n 接受一个单迭代器, 一个计数值和一个值,
fill_n(vec.begin(), vec.size(), 0)     // 注意操作不能超过元素范围个数
  1. 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
( — ?;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值