😸
ラムダ式とお近づきになろうとしてみるメモ
やること
ラムダ式をまともに使えないので、ちゃんと勉強しようと思って...。
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
型とはなんじゃいってところから始めないといけない。
未来の自分が調べてまとめるはず。
参考
- https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-expressions
- https://ufcpp.net/study/csharp/sp3_lambda.html
Discussion