c++ primer(第五版)笔记 第十章 泛型算法(2)

31 篇文章 0 订阅
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::string;
//_1 占位符的空间
using namespace std::placeholders;

inline string make_plural( string::size_type count, const string &, const string &);
void practice_10_13( vector<string> &, vector<string>::size_type);
void practice_10_24( vector<string> &);
int main()
{
	vector<string> vs{ "world", "hahahahahahah", "hhhhh", "hello", "lesson10", "c++", "vector"};
	practice_10_24( vs);
	
	practice_10_13( vs, 5);
	//创建 lambda 表达式时,编译器生成一个 lambda 类类型,该对象中包含与 capture list 一致的数据成员,可以通过值或引用初始化这些成员
	// 向一个函数传递 lambda 时,创建了类类型和其对象
	
	// capture list 值传递
	int val = 57;
	//创建时,拷贝 capture list 的值,后续的改变不影响 lambda
	auto f = [ val] { return val;};
	val = 0;
	cout << "f() :" << f() << endl;
	cout << "val :" << val << endl;
	
	// capture list 引用传递, 使用时要保证所引用的对象有效
	auto f2 = [ &val] { return val;};
	val = 32;
	cout << "f2() :" << f2() << endl;
	cout << "val :" << val << endl;
	
	//捕获列表中的变量是只读的,将捕获列表声明为 mutable,可在 lambda 中改变该值 
	auto f3 = [ val] () mutable { return ++val;};
	cout << "f3() :" << f3() << endl;
	cout << "val :" << val << endl;
	

}

void practice_10_13( vector<string> &vs, vector<string>::size_type sz)
{
	// 谓词是一个可调用的表达式,返回结果可用于条件,接受谓词参数的算法对输入的序列中元素调用谓词
	// 一元谓词(unary predicate),接受以一个参数
	// 二元谓词(binary predicate),接受以两个参数

	// 可调用对象(callable object):函数,函数指针,重载了函数运算符的类,lambda 表达式
	// lambda 表达式可以理解为未命名的内联函数
	// 形式:[capture list] (parameter list) -> return type {function body}
	// capture list 是 lambda 表达式所在函数中定义的局部变量
	// 必须使用尾置返回,可以省略参数列表和返回类型
	// auto f = []{ return 42;}
	// cout << f() << endl;
	//实参数量必须与形参一致,不允许默认参数

	// auto vsi = partition(vs.begin(), vs.end(), is_shorter);
	// 使用 lambda 表达式替换函数
	// 空的 capture list 表示不能使用任何其所在函数内的局部变量
	
	//字典排序
	sort( vs.begin(), vs.end());
	//去重
	auto vsi = unique( vs.begin(), vs.end());
	//删除重复
	vs.erase( vsi, vs.end());
	//长度排序,稳定排序
	stable_sort(
					vs.begin(),
					vs.end(),
					[] ( const string &s1,  const string &s2) -> bool { return s1.size() < s2.size();}
					);
	//筛选长度,返回指针
	auto wc = find_if(
								vs.begin(),
								vs.end(),
								// []									空捕获列表,不能使用所在函数的变量
								// [ =]								隐式捕获列表,lambda 拷贝所有来自所在函数的实体的值		
								// [ &]								隐式捕获列表,lambda 采用引用方式使用所有来自所在函数的实体		
								// [ &, identifier_list]		采用拷贝方式使用 identifier_list 来自所在函数的实体的值,其他实体采用引用方式
								// [ =, identifier_list]		和上一条相反
								// [identifier_list]			显式捕获列表
								// [ sz] ( const string &s) -> bool { return s.size() >= sz;}
								[ =] ( const string &s) -> bool { return s.size() >= sz;}
					);
	auto count = vs.end() - wc;
	cout << count << " " << make_plural( count, "word", "s") << " of length " << sz << " or longer" << endl;
	// 打印
	for_each(
				wc,
				vs.end(),
				[] ( const string &s) -> void { cout << s << " ";}
				);
	cout << endl;
}

string make_plural( string::size_type count, const string &s1, const string &s2)
{
	return ( count > 1) ? s1 + s2 : s1;
}

//课后练习
bool check_size( const string &s, string::size_type sz)
{
	return s.size() >= sz;
}

void practice_10_24( vector<string> &vs)
{
	string str;
	
	cin  >> str;
	auto wc = find_if( vs.begin(),
					vs.end(),
					bind( check_size, _1, str.size()));
	cout << *wc << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值