奇技淫巧:Lambda表达式

这篇具有很好参考价值的文章主要介绍了奇技淫巧:Lambda表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近学习到的奇技淫巧:Lambda表达式,将函数包括递归函数改为Lambda表达式写法,可节省大量时间,在大量调用下可能节省近一半时间。

说明

该语法过于复杂,见https://en.cppreference.com/w/cpp/language/lambda,本文仅写在算法竞赛下的应用。

该语法在OIWiki中有所提及,但是十分抽象,而这里将给出的简单易懂的用法,可能不太全面,在算法竞赛中已经够用了。

有关该语法是否可用问题:关于NOI系列活动中编程语言使用限制的补充说明,这表明NOI系列比赛中(包括noip,csp)已经开始使用C++14标准,而该表达式在C++11中就已经支持

具体用法:

无自身递归调用

auto 函数名 = [&](参数) -> 函数类型 { 内容 };

给定 x 、y, 求x + y

一般写法

#include<bits/stdc++.h>
using namespace std;

int sum(int x, int y)
{
	return x + y;
}

int main()
{
	int x, y;
	cin >> x >> y;
	cout << sum(x, y);
}

Lambda表达式写法

#include<bits/stdc++.h>
using namespace std;

int main()
{
	auto sum = [&](int x, int y) -> int 
	{
		return x + y;
	};//注意这里的分号
	int x, y;
	cin >> x >> y;
	cout << sum(x, y);
}

有自身函数调用

注意:如果函数内存在对自生的调用,按上述写法是无法编译的,我们需要这样写:

int main()
{
	auto 函数名 = [&](参数, auto&& self) -> 函数类型
	{ 
		//内容 
		//对自身调用时:
		self(参数, self);
	};
	//主函数内调用:
	函数名(参数, 函数名);//举例 : int d = gcd(x, y, gcd);
};

gcd函数

Lambda表达式写法

#include<bits/stdc++.h>
using namespace std;

int main()
{
	auto gcd = [&](int x, int y, auto&& self) -> int 
	{
		if(y == 0) return x;
		else return self(y, x % y, self);
	};//注意这里的分号
	int x, y;
	cin >> x >> y;
	cout << gcd(x, y, gcd);
}

线段树

题目luogu线段树1

一般代码

// Problem: P3372 【模板】线段树 1
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3372
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define ll long long
#define MAXn 100010
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sum(x) tr[x].sum
#define add(x) tr[x].add
#define l(x) tr[x].l
#define r(x) tr[x].r
#define sz(x) tr[x].sz
#define mid(x) tr[x].mid
using namespace std;

int n, m;
int a[MAXn];

struct SegmentTree
{
	ll ls, rs, l, r, sum, add, sz, mid;
} tr[MAXn << 2];

ll read()
{
	ll num = 0, w = 1;
	char ch = getchar();
	while(ch > '9' || ch < '0') { if(ch == '-') w = -1; ch = getchar(); }
	while(ch <= '9' && ch >= '0') { num = (num << 3) + (num << 1) + (ch - '0');	ch = getchar(); }
	return num * w;
}

void build(int ind, int L, int R)
{
	l(ind) = L;
	r(ind) = R;
	sz(ind) = R - L + 1;
	mid(ind) = (L + R) >> 1;
	if(L == R)
	{
		sum(ind) = a[L];
		return;
	}
	ls(ind) = ind << 1;
	rs(ind) = ind << 1 | 1;
	int mid = (L + R) >> 1;
	build(ls(ind), L, mid);
	build(rs(ind), mid + 1, R);
	sum(ind) = sum(ls(ind)) + sum(rs(ind));
}

void pushdown(int x)
{
	if(add(x))
	{
		sum(ls(x)) += add(x) * sz(ls(x));
		sum(rs(x)) += add(x) * sz(rs(x));
		add(ls(x)) += add(x);
		add(rs(x)) += add(x);
		add(x) = 0;
	}
}

void update(int x, int L, int R, ll k)
{
	if(L <= l(x) && R >= r(x))
	{
		sum(x) += sz(x) * k;
		add(x) += k;
		return;
	}
	pushdown(x);
	if(L <= mid(x)) update(ls(x), L, R, k);
	if(R >= mid(x) + 1) update(rs(x), L, R, k);
	sum(x) = sum(ls(x)) + sum(rs(x));
}

ll ask(int x, int L, int R)
{
	if(L <= l(x) && R >= r(x))
	{
		return sum(x);
	}
	pushdown(x);
	ll res = 0;
	if(L <= mid(x)) res += ask(ls(x), L, R);
	if(R >= mid(x) + 1) res += ask(rs(x), L, R);
	return res;
}

int main()
{
	n = read(), m = read();
	for(int i = 1; i <= n; i++)
		a[i] = read();
	build(1, 1, n);
	while(m--)
	{
		ll flag, x, y;
		flag = read(), x = read(), y = read();
		if(flag == 1)
		{
			ll k;
			k = read();
			update(1, x, y, k);
		}
		else 
		{
			printf("%lld\n", ask(1, x, y));
		}
	}
	return 0;
}

Lambda代码

// Problem: P3372 【模板】线段树 1
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3372
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define ll long long
#define MAXn 100010
#define ls(x) tr[x].ls
#define rs(x) tr[x].rs
#define sum(x) tr[x].sum
#define add(x) tr[x].add
#define l(x) tr[x].l
#define r(x) tr[x].r
#define sz(x) tr[x].sz
#define mid(x) tr[x].mid
using namespace std;

int n, m;
int a[MAXn];

struct SegmentTree
{
	ll ls, rs, l, r, sum, add, sz, mid;
} tr[MAXn << 2];

int main()
{
	
	auto read = [&]() -> ll
	{
		ll num = 0, w = 1;
		char ch = getchar();
		while(ch > '9' || ch < '0') { if(ch == '-') w = -1; ch = getchar(); }
		while(ch <= '9' && ch >= '0') { num = (num << 3) + (num << 1) + (ch - '0');	ch = getchar(); }
		return num * w;
	};
	auto build = [&](int ind, int L, int R, auto&& self) -> void
	{
		l(ind) = L;
		r(ind) = R;
		sz(ind) = R - L + 1;
		mid(ind) = (L + R) >> 1;
		if(L == R)
		{
			sum(ind) = a[L];
			return;
		}
		ls(ind) = ind << 1;
		rs(ind) = ind << 1 | 1;
		int mid = (L + R) >> 1;
		self(ls(ind), L, mid, self);
		self(rs(ind), mid + 1, R, self);
		sum(ind) = sum(ls(ind)) + sum(rs(ind));
	};
	auto pushdown = [&](int x) -> void
	{
		if(add(x))
		{
			sum(ls(x)) += add(x) * sz(ls(x));
			sum(rs(x)) += add(x) * sz(rs(x));
			add(ls(x)) += add(x);
			add(rs(x)) += add(x);
			add(x) = 0;
		}
	};
	auto update = [&](int x, int L, int R, ll k, auto&& self) -> void 
	{
		if(L <= l(x) && R >= r(x))
		{
			sum(x) += sz(x) * k;
			add(x) += k;
			return;
		}
		pushdown(x);
		if(L <= mid(x)) self(ls(x), L, R, k, self);
		if(R >= mid(x) + 1) self(rs(x), L, R, k, self);
		sum(x) = sum(ls(x)) + sum(rs(x));
	};
	auto ask = [&](int x, int L, int R, auto&& self) -> ll
	{
		if(L <= l(x) && R >= r(x))
		{
			return sum(x);
		}
		pushdown(x);
		ll res = 0;
		if(L <= mid(x)) res += self(ls(x), L, R, self);
		if(R >= mid(x) + 1) res += self(rs(x), L, R, self);
		return res;
	};

	n = read(), m = read();
	for(int i = 1; i <= n; i++)
		a[i] = read();
	build(1, 1, n, build);
	while(m--)
	{
		ll flag = read(), x = read(), y = read();
		if(flag == 1)
		{
			ll k;
			k = read();
			update(1, x, y, k, update);
		}
		else 
		{
			printf("%lld\n", ask(1, x, y, ask));
		}
	}
	return 0;
}

时间比较

  • 一般做法

奇技淫巧:Lambda表达式

  • Lambda表达式

奇技淫巧:Lambda表达式文章来源地址https://www.toymoban.com/news/detail-651141.html

到了这里,关于奇技淫巧:Lambda表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Intellij IDEA有什么奇技淫巧?

    IDEA全称 IntelliJIDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在 智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计 等方面的功能可以说是超常的。 idea下载地址:jetbrains.com/idea 下面来说几个I

    2024年02月15日
    浏览(39)
  • SQL奇技淫巧之pipeline管道

    这里创建了一个名为 test_type 的类型, AS OBJECT 表示这个类型是一个对象类型, 包含了两个字段(也可以说是列),数字类型的 colum1 和字符串类型的 colum2 ; 这里创建了一个名为 test_type_table 的类型, AS TABLE 表示这个类型是一个表(集合)类型, OF test_type 表示这个类型是基于 t

    2024年02月13日
    浏览(36)
  • Sql奇技淫巧之ROWNUM伪列

    ROWNUM 是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行 ROWNUM 为1,第二行 ROWNUM 为2,以此类推。 ROWNUM 伪列是在 WHERE 子句之前生成的,就是说它并不是在执行了 WHERE 子句过滤之后再对数据编号 比如在执行 WHE

    2024年02月13日
    浏览(38)
  • Oracle/PL/SQL奇技淫巧之ROWNUM伪列

    ROWNUM 是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行 ROWNUM 为1,第二行 ROWNUM 为2,以此类推。 ROWNUM 伪列是在 WHERE 子句之前生成的,就是说它并不是在执行了 WHERE 子句过滤之后再对数据编号 比如在执行 WHE

    2024年02月12日
    浏览(41)
  • Oracle/PL/SQL奇技淫巧之Json转表

    在Oracle中,有些时候我们需要在一个json文档中查数据 这个时候我们可以通过 JSON_TABLE 函数来把 json文档 提取成一张可以执行正常查询操作的表 先看 JSON_TABLE 函数的基础用法: 其中: json_data :要从中提取数据的 JSON文档 或 JSON列 $.json_path :JSON路径表达式,该表达式指定要提

    2024年02月12日
    浏览(42)
  • 一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频

    上一篇文章一看就懂的OpenGL ES教程——渲染宫崎骏动漫重拾童年 已经详细阐述了如何用OpenGL es将原始的YUV数据组成的视频渲染到屏幕上,想必有很多童鞋在阅读了它之后依然觉得回味无穷,学习的胃口也越来越大了,因为你们知道仅仅渲染视频是不够的,我们要的是,能够在

    2024年04月25日
    浏览(43)
  • 一看就懂的OpenGL ES教程——仿抖音滤镜的各种奇技淫巧(一)_opengl es添加视频(1)

    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学

    2024年04月16日
    浏览(43)
  • 【javaSE】 Lambda表达式与Lambda表达式的使用

    Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression) ,基于数学中的λ演算得名,也

    2024年02月08日
    浏览(62)
  • 进阶JAVA篇- Lambda 表达式与 Lambda 表达式的省略规则

    目录         1.0 什么是 Lambda 表达式?         1.1 既然跟匿名内部类相关,先来回顾匿名内部类。          1.2 Lambda 表达式与匿名内部类之间的关系。         1.3 函数式接口         1.4 在具体代码中来操作一下         2.0 Lambda 表达式省略规则          Lambda 表达

    2024年02月08日
    浏览(55)
  • 探索Python中的函数式编程:Lambda表达式与函数式工具【第135篇—Lambda表达式】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Python编程世界中,函数式编程逐渐成为了一种流行的范式,特别是在处理数据和编写简洁、高效代码时。函数式编程的核心思想是将计算视

    2024年04月08日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包