😸

ラムダ式とお近づきになろうとしてみるメモ

2024/03/26に公開

やること

ラムダ式をまともに使えないので、ちゃんと勉強しようと思って...。
0~100000の乱数を100000個用意し、10未満の数を出力するようなプログラムを書く。

プログラム

まずはC#から。

using System;

class LambdaTest
{
	delegate bool Check4Int(int n);

	static List<int> Select2Int(int[] inp, Check4Int c4i)
	{
		List<int> ret = new();
		foreach(int x in inp) if(c4i(x)) ret.Add(x);
		return ret;
	}

	static void Main()
	{
		int arySize = 100000;
		Random random = new();
		int[] nums = new int[arySize];

		for(int i = 0; i < arySize; i++) nums[i] = random.Next(0, arySize);

		List<int> under10 = new();
		under10 = Select2Int(nums, (int x) => { return x < 10; });

		foreach(int x in under10) Console.WriteLine(x);
	}
}

つぎにC++。

#include <iostream>
#include <vector>
#include <random>
#include <functional>
#include <chrono>

using namespace std;

mt19937_64 gen(chrono::system_clock::now().time_since_epoch().count());
int randomNext(int minVal, int maxVal)
{
	uniform_int_distribution<int> dist(minVal, maxVal);
	return dist(gen);
}

using Check4Int = function<bool(int)>;

vector<int> Select2Int(vector<int> inp, Check4Int c4i)
{
	vector<int> ret;
	for(int x : inp) if(c4i(x)) ret.push_back(x);
	return ret;
}

int main()
{
	int arySize = 100000;
	vector<int> nums(arySize);

	for(int i = 0; i < arySize; i++) nums[i] = randomNext(0, arySize);

	vector<int> under10;
	under10 = Select2Int(nums, [](int x) -> bool { return x < 10; });

	for(int x : under10) cout << x << endl;
}

比較

上記のプログラムは、二言語間の差異を少なくするためかなり冗長になった。
あくまで匿名関数を記述するためのラムダ式を比較する。


言語 代入される型 キャプチャリスト パラメータリスト オプション 戻り値の型 関数の処理
C# delegate なし ( ) なし => 型名 { }
C++ function(?) [ ] ( ) mutable 例外仕様 属性 -> 型名 { }

C#の方はわかりやすいが、C++は(;´д`)ゞ ゼンゼンワカラン。
そもそもfunction型とはなんじゃいってところから始めないといけない。
未来の自分が調べてまとめるはず。

参考


Discussion