はじめに
この一週間はHTML/CSSに時間を費やした。C++と両立できるかと思ったが無理だった。HTML/CSSのqiitaを書こうかなと考えたが記事を書くよりてっとりばやく終わらして、C++再開しようと思った。とりあえず、HTML/CSSのデモページを作って雰囲気は掴めたので、これからWebサイトは趣味程度にコツコツ作っていくつもり。そして、Webサイトを実際に作りながらjavascriptを平行してやろうかなと思う。
そして次は、Webアプリケーションに必要なバックエンド側に取り掛かろうと思う。いろいろ話を聞いたり調べて観た結果、 Golang
をすることに決めた。 Go
は C++
に似ていると聞いたので楽しみ。明日から取り掛かろうと思う。
1週間の成果
教本を見ながら作ってみた。著作権フリーとのことで掲載するのは問題ない。
HTML/CSS
は思ったより簡単で感覚的にコーディングができた。 (C++
に毒されているせいなのか?)
Webページの制作は、コーディングより設計の方が大変だなと感じた。
C++
学校の方で、 linkedIn
のオンライン教材が配られた。そこに、 C++
の講座があったので今日はそれをやってみる。
ラムダ式
前々から、ラムダ式は気になっていた。 std::sort
を使いたいときに、ラムダ式がよくわからないから避けていた(笑)。今回の目標は、ラムダ式で自由に sort
できるようにすること!
ラムダ式とはなにか
ラムダ式とは、簡易的な関数オブジェクトをその場で定義するための機能である。
標準C++のアルゴリズムライブラリには、関数を引数とするものが多くある。それらは各問題を解くために非常に有用ではあったが、アルゴリズムを使用するたびに関数オブジェクトを定義することは非常に冗長で使いにくかった。アルゴリズムをより使いやすくするための言語サポートとして、ラムダ式が導入されることとなった。
std::sort
のソート方法を増やすためにあると思っていたが違うみたい。
とりあえず書いてみる
# include <iostream>
int main()
{
[](int x)//int x は 引数
{
std::cout << x << std::endl;
}(100);//関数呼び出し
}
100
ラムダ式は []
で書き始めて (int x)
が関数の引数型宣言、 {}
の中に関数の中身を書いていく。ラムダ式は関数オブジェクトにより、関数呼び出し演算子 (100)
を使用して関数を呼び出している。
ラムダ式をそのまま代入できる!?
ラムダ式は auto
を使うことで適当な変数に代入することができる。
# include <iostream>
int main()
{
auto a = [](int x)//int x は 引数
{
std::cout << x << std::endl;
};
a(500);
std::cout << "a の中身は" << a << std::endl;//実験
}
500
1
aにラムダ式を代入して a(500)
と入力すれば 500
と出力された。好奇心で、 a
の中身を std::cout
で出力してみたらどうなるのか調べてみると、 1
が出力された...。アドレスかなんかが表示されるのかと思いきや全く謎の数字。よくわからん。
ラムダ式の返り値は指定できる!
ラムダ式の返り値は return
の値から予測してくれるのだが、指定したければ指定できる。
# include <iostream>
int main()
{
auto a = [](int x) -> int//ここで返り値の型指定!
{
return x * 4.3; //浮動少数点でかけている
};
std::cout << "a(500)は" << a(500) << std::endl;
}
a(500)は2150
ちゃんと int型
になっている事がわかります。
ラムダ式は外のローカル変数が使える!
基本的に関数は引数を通してでないと外のローカル変数は使えない。しかし、ラムダ式では、キャプチャという機能を使うことで外のローカル変数を使うことができる。
キャプチャの方法は []
の中にオプションをつける。
-
[=] コピーキャプチャ
ローカル変数をコピーして使う方法。つまりコピー渡し
みたいな感じ。しかし、コピー先がread_only
のため、y
の値は直接変えることができない。例(y = y - 5;
) -
[&] 参照キャプチャ
参照渡しで使う方法。これは、y = y - 5;
ができる。もとの値にも影響がある。 -
[y, &z] 明示的に分ける
4[f = y + z ] 新しい変数を定義
# include <iostream>
int main()
{
int y = 5;
int z = 10;
auto a = [=](int x) -> int//ここで返り値の型指定!
{
//y -= 5;
return x + y + z;
};
std::cout << "a(500)は" << a(500) << std::endl;
std::cout << "yの値は" << y << std::endl;
auto b = [&](int x) -> int//ここで返り値の型指定!
{
y -= 5;
return x + y + z;
};
std::cout << "b(500)は" << b(500) << std::endl;
std::cout << "yの値は" << y << std::endl;
}
a(500)は515
yの値は5
b(500)は510
yの値は0
ラムダ式は引数もautoにすべき!
引数を auto
にして返り値の指定をしなければ template
みたいに使えるという。
また、クラス内では this
ポインタを使うことでクラスのメンバにもアクセスできる。
まとめ
ソート使うとき以外の使いみちは、まだみたことないけどソートのときくらいは使おうと思う。
終わりに
linkedinわかりやすいね。スマートポインタの動画もあったから明日はそれやってみる。
残念ながら Go
はlinkedinにはなかった。
おやすみんさい。