Your SlideShare is downloading. ×
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

大学でC++03を教わった私が、便利そうだと思ったC++11の新機能

126

Published on

『大学でC++03を教わった私が、便利そうだと思ったC++11の新機能』 …

『大学でC++03を教わった私が、便利そうだと思ったC++11の新機能』
歌舞伎座.tech#8「C++初心者会」2015/5/17 LT

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
126
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 歌舞伎座.tech#8「C++初心者会」(2015/5/17) で大学 C++03を わった が、教 私 そうだと った便利 思 C++11の新機能 @tSU_RooT 弦本 春樹
  • 2. 自己紹介 Twitter:@tSU_RooT 本名:弦本 春樹 都内の私立工業大学 工学部 通信工学科 4年 ● 就活中(コードが書ける仕事探してます) ● C++歴:1年とちょっと ● C++を使い始めたきっかけ → cocos2d-xでゲームを作ろうと思ったから(完成せず挫折した) ● 大学の授業でも教わった ● 最近よく書いているのはGolang(C++ …じゃなくてゴメンなさい )
  • 3. 大学(学部)におけるC++(等の)教育(1) ● 学部ではC, C++, Javaを主に授業で教える (学科や取った授業で少し変わる) ● そこで教えられるC++はC++03 ● 理由として教授に時間が無く 一度作ったカリキュラムや教材の変更が 困難ということが考えられる。 ● 必修の実験のプリントに間違ったことが書いて あったこともあった ※ 個人の感想なので他の大学では違うかもしれません
  • 4. 大学(学部)におけるC++(等の)教育(2) ● たぶん教授がC++11の新機能を知らない? → 結果 学生には古いC++が教えられる ● そもそも学部の2-3年間で 割りと多くの人間がプログラミングに挫折する ● ハードウェアとソフトウェアが両方学べる学科だと ハードに逃げる人も多い ● 何故か? → やはりC,C++は難解、 よくわかっていないとコンパイルを通すだけで苦労する
  • 5. しかしこれはもったいないのでは?
  • 6. 最近のC++は(たぶん)初心者に優しい ● スマートポインタにより いちいち細かく管理する必要が減少した → メモリ管理の簡便化 ● ユーティリティに多数の機能が追加 例 <random> : メルセンヌ・ツイスタ法などを使ったまとも乱数生成が行える。 <regex>: 標準の正規表現ライブラリ、C++11から追加 ● clangのエラーメッセージはGCCよりわかりやすい → 初心者がつまづきがちな、ささいな挫折が回避される
  • 7. そこで C++歴1年とちょっとの 初心者に毛が生えた程度の私が “ ”初心者 こそ 知るべきだと思った、 C++11の便利な機能を紹介したい
  • 8. 目次 ● 1. autoによる型推論 ● 2. スマートポインタ ● 3. rand()ではなく<random> ● 4. マクロの置き換えとしてのconstexpr
  • 9. 1.autoによる型推論 ● 型推論・・・型を自動的に決定する機能 ● 最近の言語ではよく見る(SwiftとかGoとか) ● 型の名前が長い時にいちいち便利
  • 10. コード例 // C++11以前 int i1 = 42; double d1 = 3.1415; int* p1 = &i1; std::list<int>::iterator it = list.begin(); // listの型はstd::list<int> // C++11以後 auto i1 = 42; // int型になる auto d1 = 3.1415; // double型になる auto p1 = &i1; // int*型になる auto it = list.begin(); // std::list<int>::iteratorになる
  • 11. 1.autoによる型推論を使うメリット ・必要が無い時にいちいち型を書く必要がない ・typoや記憶違いによるコンパイルエラーを防げ る(これはIDEでも解決できそうだが) ・特にコンパイルエラーは初心者のやる気を削ぐ ので、コンパイラが助けるのは重要(だと思う)
  • 12. 2.スマートポインタ ● C++11から標準に入った(Boostにはあった) C++ではメモリの管理が難しく、 自分で動的に確保したメモリは自分で解放する必要が あり、初心者を挫折させたり敬遠させるイメージを作 る原因になりがち。(ロジックを書き間違えると二重 解放などで初心者には不可解なエラーが出る) ● 標準にスマートポインタが入ったので、それを使えば だいぶつらくなくなる(はず)
  • 13. コード例 // C++03 以前 void f() { X ptr = new X(); // 何か処理 delete ptr; // 解放 } // C++11 void f(size_t n) { auto ptr = unique_ptr<X>(new X()); // 何か処理 } // ptrと一緒に自動で解放
  • 14. 2.スマートポインタ その他 ● リソースを共有したい時はshared_ptrを用い る。 ● shared_ptrにはヘルパ関数があ り、make_shared<X>()で安全に作成できる。 ● Objective-Cと同じ、参照カウント型 ● C++03にもauto_ptrという物があったが、 非推奨になったのでunique_ptrを使うべき。
  • 15. 3.rand()ではなく<random> ● 標準のrand()は線形合同法を用いるので 質があまりよくないことで有名 ● …が、知らない人は知らないと思われる(特に初心者) 乱数の質が悪く問題になった例:「カルドセプトサーガ」にダイス目が偶数と奇数を繰り返すバグ (slashdot) http://srad.jp/story/06/12/06/0155253/ ● <random>というライブラリが入ったので基本的にこちら を使うべき
  • 16. コード例 // メルセンヌ・ツイスタを用いた1D6のサイコロ mt19937 engine; uniform_int_distribution<int> dist(1, 6); // 一様整数分布 int result; result = dist(engine); // 真の乱数生成 random_device rdev; result = dist(rdev); engine.seed(rdev()); // 種値の設定に適している
  • 17. 3.rand()ではなく<random> を使うメリット ● 分布クラスが多様で科学技術計算に向いている 例:二項分布、ポワソン分布、χ二乗分布など ● メルセンヌ・ツイスタだけでなく、 /dev/random や /dev/urandomから読み取った 真の乱数生成器も使える
  • 18. 4.マクロの置き換えとしてのconstexpr ● 指定するとコンパイル時に定数となる機能 ● 変数につけるとコンパイル時定数、 関数につけるとコンパイル時に計算可能であることを指定でき る。 ● C++ではマクロも互換性のために残されているが、 単に定数を定義したいだけならあまりオススメできない。 ● …が 、授業のコードで使われている。 例: #define DIFF_FOR_STOP 1.0E-10 のようなマクロ
  • 19. コード // あまり良くない例 #define DIFF_FOR_STOP 1.0E-10 // constexprを使う例 constexpr auto DIFF_FOR_STOP = 1.0E-10;
  • 20. メリット ● マクロはトークン列に対する置換なので、 文法を解析して適切に置き換えているわけでは ない。 → 結果、人間の直感に反するバグが発生するこ とがある。これは発見しづらい ● constexprを用いれば問題無いし、 コンパイル時定数になるので コンパイル時の計算にも使用できる。
  • 21. おわりに ● もしもC++を使うならできるだけ最新 の物を使いたい ● C++11(or 14)が早く普及するといい なぁと思っています。
  • 22. ありがとうございました。

×