SlideShare une entreprise Scribd logo
1  sur  52
Télécharger pour lire hors ligne
C++11 is 何?
C++11 でできること
.
...... C++11
hatsusato
京都大学理学部 1 回
2012 年 12 月 20 日
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 自己紹介
@hatsusato のプロフィール
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 自己紹介
@hatsusato のプロフィール
C++一筋
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 自己紹介
@hatsusato のプロフィール
C++一筋
理学部数学系志望
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 自己紹介
@hatsusato のプロフィール
C++一筋
理学部数学系志望
大学院は情報の流れ濃厚
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 自己紹介
@hatsusato のプロフィール
C++一筋
理学部数学系志望
大学院は情報の流れ濃厚
げんごつくる
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 目次
...1 C++11 is 何?
...2 C++11 でできること
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
標準ライブラリも大きく拡充され、たくさんの便利なラ
イブラリが簡単に利用できるように。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
標準ライブラリも大きく拡充され、たくさんの便利なラ
イブラリが簡単に利用できるように。
それでいて実行時速度は変わらないか、むしろ速く
なった。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 is 何?
C++11 とは、2011 年に標準化された C++の最新規格の
ことである。
それまでの C++03 とは比べ物にならないほどまともに
なった。これで一人前の言語に。
コア言語の機能が拡張され、今までに出来なかったり、
面倒くさい遠回りをして実現していたたくさんのことが
簡単にできるように。
標準ライブラリも大きく拡充され、たくさんの便利なラ
イブラリが簡単に利用できるように。
それでいて実行時速度は変わらないか、むしろ速く
なった。
要するに C++11 最高。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 でできること
auto
range-based for
initializer list
nullptr
lambda expression
move semantics
constexpr
useful and powerful libraries
時間の都合により割愛します。
and more!
hatsusato C++11
C++11 is 何?
C++11 でできること
.. auto
hatsusato C++11
C++11 is 何?
C++11 でできること
.. auto
.
これまで
..
......
for(std :: vector <std ::pair <std:: string ,std :: string > >::
const_iterator it=v.begin (); it!=v.end (); ++it){
// do something.
}
変数を初期化する際には、必ず変数の型を明示的に指定
する必要があるが、時には複雑な型名を書かなければな
らないことがある。
特にテンプレートが絡むと、右辺の式の型がどんな型に
なるのかを知ることが困難になることがある。
しかし、いずれにせよ右辺の式の型は一意に定まるので
変数の型は自明である。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. auto
.
これから
..
......
for(auto it=std :: begin(v); it!= std :: end(v); ++it){
// do something.
}
C++は型推論を手に入れた!
コンパイラは右辺の式の型を知っているので、自動的に
auto を右辺の式の型に置き換えてくれる。
素人から玄人まで、誰でも簡単に使えて誰でも利益を享
受できるので、どんどん使いましょう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. auto
.
これまで
..
......
for(std :: vector <std ::pair <std:: string ,std :: string > >::
const_iterator it=v.begin (); it!=v.end (); ++it){
// do something.
}
.
これから
..
......
for(auto it=std :: begin(v); it!= std :: end(v); ++it){
// do something.
}
hatsusato C++11
C++11 is 何?
C++11 でできること
.. range-based for
hatsusato C++11
C++11 is 何?
C++11 でできること
.. range-based for
.
これまで
..
......
for(std :: vector <std ::string >:: const_iterator vit=v.begin
(); vit !=v.end (); ++vit){
for(std :: string :: const_iterator sit=vit ->begin (); sit!=
vit ->end (); ++ sit ){
// do something.
}
}
コンテナ内の全要素を走査するといったことは頻繁に起
こるが、そのたびにイテレータを作る必要があり、可読
性の低いコードになってしまう。
イテレータはポインタのようなものなので、いちいち間
接参照する必要がある。コンテナのコンテナを走査した
りすると可読性を著しく損なう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. range-based for
.
これから
..
......
for(auto vx : v){
for(auto sx : vx){
// do something.
}
}
コンテナの全要素を走査したい時であれば、いちいちイ
テレータを作る必要がなくなった。前述の auto を併用す
ることでコンテナの要素の型を指定する必要もない。
コンテナの各要素を参照で受け取れるので、イテレータ
の時と違って間接参照する必要がなく、コンテナのコン
テナの走査も難なく書ける。
これも簡単に使えるのでどんどん使いましょう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. range-based for
.
これまで
..
......
for(std :: vector <std ::string >:: const_iterator vit=v.begin
(); vit !=v.end (); ++vit){
for(std :: string :: const_iterator sit=vit ->begin (); sit!=
vit ->end (); ++ sit ){
// do something.
}
}
.
これから
..
......
for(auto vx : v){
for(auto sx : vx){
// do something.
}
}
hatsusato C++11
C++11 is 何?
C++11 でできること
.. initializer list
hatsusato C++11
C++11 is 何?
C++11 でできること
.. initializer list
.
これまで
..
......
int tmp []={13 ,22 ,37 ,41 ,58};
std :: vector <int > v(tmp ,tmp +5);
// vに13 ,22 ,37 ,41 ,58 を 格 納 す る 。
v.clear ();
v.push_back (13);
v.push_back (22);
v.push_back (37);
v.push_back (41);
v.push_back (58);
// vに13 ,22 ,37 ,41 ,58 を 格 納 し な お す 。
コンテナをいくつかのデータで初期化するためには、現
状では上記のように一時的に配列を作ったり、push back
を並べたりする必要があり、可読性があまりよくない。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. initializer list
.
これから
..
......
std :: vector <int > v={13 ,22 ,37 ,41 ,58};
可読性がよい。
従来の構造体や配列の初期化と同じ構文であり、また通
常のコンストラクタも {} で呼び出せるようになったの
で、「初期化は {}、関数呼び出しは ()」というように役
割分担することでコードがより明確になる。
変数の初期化の場面で {} をどんどん使いましょう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. initializer list
.
これまで
..
......
int tmp []={13 ,22 ,37 ,41 ,58};
std :: vector <int > v(tmp ,tmp +5);
// vに13 ,22 ,37 ,41 ,58 を 格 納 す る 。
v.clear ();
v.push_back (13);
v.push_back (22);
v.push_back (37);
v.push_back (41);
v.push_back (58);
// vに13 ,22 ,37 ,41 ,58 を 格 納 し な お す 。
.
これから
..
......
std :: vector <int > v={13 ,22 ,37 ,41 ,58};
hatsusato C++11
C++11 is 何?
C++11 でできること
.. nullptr
hatsusato C++11
C++11 is 何?
C++11 でできること
.. nullptr
.
これまで
..
......
// 関 数 オ ー バ ー ロ ー ド
void f(int ){ std ::cout <<"f(int)"<<std :: endl ;}
void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;}
f(NULL ); // コ ン パ イ ル エ ラ ー : 曖 昧 な オ ー バ ー ロ ー ド
そもそも C では
#define NULL ((void*)0)
となっているが、C++では (void*) から任意のポインタ
への暗黙変換ができない。そのため、C++11 以前では
#define NULL 0
となっていた。よって、NULL を数値の (int)0 と解釈す
べきか、ヌルポインタの (int*)0 と解釈すべきか曖昧に
なってしまう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. nullptr
.
これから
..
......
// 関 数 オ ー バ ー ロ ー ド
void f(int ){ std ::cout <<"f(int)"<<std :: endl ;}
void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;}
f(nullptr ); // > f(int *)
C++11 からは任意のポインタへ暗黙変換可能な
nullptr t 型のキーワード nullptr が追加され、ややこ
しい問題はなくなった。
もはや NULL を使う意味はありません。ヌルポインタを使
いたいところには nullptr を使いましょう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. nullptr
.
関数定義
..
......
// 関 数 オ ー バ ー ロ ー ド
void f(int ){ std ::cout <<"f(int)"<<std :: endl ;}
void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;}
.
これまで
..
......
f(NULL ); // コ ン パ イ ル エ ラ ー : 曖 昧 な オ ー バ ー ロ ー ド
.
これから
..
......
f(nullptr ); // > f(int *)
hatsusato C++11
C++11 is 何?
C++11 でできること
.. lambda expression
hatsusato C++11
C++11 is 何?
C++11 でできること
.. lambda expression
.
これまで
..
......
struct AbsoluteLess {
bool operator ()( int lhs , int rhs){
return std :: abs(lhs)<std :: abs(rhs );
}
};
std :: sort(v.begin (), v.end(), AbsoluteLess ());
// 絶 対 値 の 大 小 で ソ ー ト
C++11 以前はアルゴリズムごとに関数や関数オブジェク
トを作る必要があった。たとえ一度きりしか使わないア
ルゴリズムであってもいちいち関数(オブジェクト)を
作っていたが、この方法は記述量が多く、コードの流れ
がわかりづらい。また、名前空間中に余分な名前があふ
れることにつながる。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. lambda expression
.
これから
..
......
std :: sort(std :: begin(v), std ::end(v),
[]( int lhs , int rhs)->bool
{return std ::abs(lhs)<std:: abs(rhs );});
ラムダ式の登場により、アルゴリズムを表す関数(オブ
ジェクト)を作る代わりにラムダ式(つまり無名関数オ
ブジェクト)で代用できるようになった。これにより余
分な名前が名前空間にはびこることなくコードをすっき
りと書くことができるようになった。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. lambda expression
.
これまで
..
......
struct AbsoluteLess {
bool operator ()( int lhs , int rhs){
return std :: abs(lhs)<std :: abs(rhs );
}
};
std :: sort(v.begin (), v.end(), AbsoluteLess ());
// 絶 対 値 の 大 小 で ソ ー ト
.
これから
..
......
std :: sort(std :: begin(v), std ::end(v),
[]( int lhs , int rhs)->bool
{return std ::abs(lhs)<std:: abs(rhs );});
hatsusato C++11
C++11 is 何?
C++11 でできること
.. move semantics
hatsusato C++11
C++11 is 何?
C++11 でできること
.. move semantics
.
MyString クラス
..
......
class MyString{
char* _data;
size_t _size;
public:
MyString(const MyString& str) // copy constructor
:_data(new char[str._size ]), _size(str._size ){
std:: copy(str._data , str._data+_size , _data );
}
MyString(MyString && str) // move constructor
:_data(str._data), _size(str._size ){
str._data=nullptr;
str._size =0;
}
// other functions ...
};
hatsusato C++11
C++11 is 何?
C++11 でできること
.. move semantics
.
これまで
..
......
MyString :: MyString(const MyString& str)
:_data(new char[str._size ]), _size(str._size ){
std :: copy(str._data , str._data+_size , _data );
}
C++11 以前はデータの複製を作る際には、いたる所でコ
ピーが行われていた。それが当たり前だった。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. move semantics
.
これから
..
......
MyString :: MyString(MyString && str)
:_data(str._data), _size(str._size ){
str._data=nullptr;
str._size =0;
}
C++11 では右辺値参照という概念が追加され、より効率
のよいデータの複製方法が提供されるようになった。
関数の戻り値などの、代入することのできないオブジェ
クトを右辺値と呼ぶ。move とは右辺値を複製する際に
コピーをせず、ポインタの付け替えなどによってデータ
を移譲する技術のことである。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. move semantics
.
これから
..
......
MyString :: MyString(MyString && str)
:_data(str._data), _size(str._size ){
str._data=nullptr;
str._size =0;
}
move は主にユーザコード側ではなくライブラリ提供側
が利用する技術なので、ユーザコードを特に変更するこ
となく恩恵を受けられる。
STL などの右辺値参照に対応したライブラリを用いた
コードの実行時速度が、C++11 としてコンパイルするだ
けで、知らず知らずのうちに向上する。
move semantics 素晴らしい。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. constexpr
hatsusato C++11
C++11 is 何?
C++11 でできること
.. constexpr
.
これまで
..
......
#define CUBE(x) (x*x*x)
#define SIDE_SIZE (10)
#define ARRAY_SIZE (CUBE(SIDE_SIZE ))
double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列
C++11 以前は、配列の要素数として使えるのは、整数定
数または整数定数で初期化された const な変数と整数定
数で#define したシンボルのみであった。
定数から計算して得られる結果は定数では無いので、そ
の結果を const 変数に代入しても、配列の要素数として
は使えない。
かわりに上記のようにして表現することは出来るが、
#define は型安全では無いので、C++において使うのは
できるだけ避けるべきである。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. constexpr
.
これから
..
......
constexpr int Cube(int x){ return x*x*x;}
constexpr int SIDE_SIZE =10;
constexpr int ARRAY_SIZE=Cube(SIDE_SIZE );
double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列
C++11 から constexpr というキーワードが追加され、コ
ンパイル時定数とコンパイル時関数を定義することがで
きるようになった。
コンパイル時定数にはコンパイル時に決定可能な値を指
定することができ、コンパイル時にその値に置き換えら
れる。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. constexpr
.
これから
..
......
constexpr int Cube(int x){ return x*x*x;}
constexpr int SIDE_SIZE =10;
constexpr int ARRAY_SIZE=Cube(SIDE_SIZE );
double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列
コンパイル時関数は関数内で記述できる処理が制限され
ているものの、全ての引数がコンパイル時定数ならば戻
り値がコンパイル時に計算され、コンパイル時定数や
const 定数の初期化に使うことができる。引数の一部が
実行時に決定される場合は、コンパイルエラーになるこ
となく、実行時に計算される。
上記のようにコンパイル時関数には戻り値の型があり、
型安全である。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 便利なライブラリ群
スマートポインタ (shared ptr, weak ptr, unique ptr)
擬似乱数生成 (メルセンヌツイスタなど)
正規表現
ハッシュ表 (unordered map, unordered set)
スレッドライブラリ
その他たくさんの便利機能追加修正
またの機会に。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 の利用方法
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 の利用方法
C++11 はつい最近確定したばかりの巨大な規格なので、
C++11 対応したコンパイラはまだ少ないのが現状です。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 の利用方法
C++11 はつい最近確定したばかりの巨大な規格なので、
C++11 対応したコンパイラはまだ少ないのが現状です。
例えば gcc では、gcc4.3 以降で-std=c++11 オプション
(-std=c++11 の c は小文字なので注意)を指定すること
で C++11 のコードとしてコンパイルできるようになって
います。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 の利用方法
C++11 はつい最近確定したばかりの巨大な規格なので、
C++11 対応したコンパイラはまだ少ないのが現状です。
例えば gcc では、gcc4.3 以降で-std=c++11 オプション
(-std=c++11 の c は小文字なので注意)を指定すること
で C++11 のコードとしてコンパイルできるようになって
います。
ちなみに今回のスライドのコードスニペットは gcc
version 4.7.2 で実行確認しました。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. C++11 の利用方法
C++11 はつい最近確定したばかりの巨大な規格なので、
C++11 対応したコンパイラはまだ少ないのが現状です。
例えば gcc では、gcc4.3 以降で-std=c++11 オプション
(-std=c++11 の c は小文字なので注意)を指定すること
で C++11 のコードとしてコンパイルできるようになって
います。
ちなみに今回のスライドのコードスニペットは gcc
version 4.7.2 で実行確認しました。
もはや C++03 でコードを書くことは大きな損失に他なり
ません。これから C++を使うときは是非 C++11 を使い
ましょう。
hatsusato C++11
C++11 is 何?
C++11 でできること
.. まとめ
C++11 は書きやすく、読みやすく、また速いコードを簡
単に書くことができる!素晴らしい!
hatsusato C++11
C++11 is 何?
C++11 でできること
.. 訂正
//do something. の部分で v に対して変更を加えないのであ
れば、auto ではなくて、const auto であるべき。
.
auto
..
......
for(const auto it=std:: begin(v); it!=std:: end(v); ++it){
// do something.
}
.
range-based for
..
......
for(const auto& vx : v){
for(const auto& sx : vx){
// do something.
}
}
hatsusato C++11

Contenu connexe

Tendances

Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編道化師 堂華
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 

Tendances (20)

Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
C++入門?
C++入門?C++入門?
C++入門?
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
C++ tips4 cv修飾編
C++ tips4 cv修飾編C++ tips4 cv修飾編
C++ tips4 cv修飾編
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
C++ tips1 #include編
C++ tips1 #include編C++ tips1 #include編
C++ tips1 #include編
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
Map
MapMap
Map
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 

Similaire à C++11

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, WorldNaohiro Aota
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作uchan_nos
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる5t111111
 
イチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコンイチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコン三七男 山本
 
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うSwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うhayato iida
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1sunaemon
 

Similaire à C++11 (20)

ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
Move semantics
Move semanticsMove semantics
Move semantics
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
みんな大好き! Hello, World
みんな大好き! Hello, Worldみんな大好き! Hello, World
みんな大好き! Hello, World
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみるRubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
 
イチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコンイチからはじめるLuarida-マイコン
イチからはじめるLuarida-マイコン
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うSwiftでRiemann球面を扱う
SwiftでRiemann球面を扱う
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1
 

Plus de 京大 マイコンクラブ

かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 

Plus de 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

C++11

  • 1. C++11 is 何? C++11 でできること . ...... C++11 hatsusato 京都大学理学部 1 回 2012 年 12 月 20 日 hatsusato C++11
  • 2. C++11 is 何? C++11 でできること .. 自己紹介 @hatsusato のプロフィール hatsusato C++11
  • 3. C++11 is 何? C++11 でできること .. 自己紹介 @hatsusato のプロフィール C++一筋 hatsusato C++11
  • 4. C++11 is 何? C++11 でできること .. 自己紹介 @hatsusato のプロフィール C++一筋 理学部数学系志望 hatsusato C++11
  • 5. C++11 is 何? C++11 でできること .. 自己紹介 @hatsusato のプロフィール C++一筋 理学部数学系志望 大学院は情報の流れ濃厚 hatsusato C++11
  • 6. C++11 is 何? C++11 でできること .. 自己紹介 @hatsusato のプロフィール C++一筋 理学部数学系志望 大学院は情報の流れ濃厚 げんごつくる hatsusato C++11
  • 7. C++11 is 何? C++11 でできること .. 目次 ...1 C++11 is 何? ...2 C++11 でできること hatsusato C++11
  • 8. C++11 is 何? C++11 でできること .. C++11 is 何? hatsusato C++11
  • 9. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 hatsusato C++11
  • 10. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 hatsusato C++11
  • 11. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 hatsusato C++11
  • 12. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 標準ライブラリも大きく拡充され、たくさんの便利なラ イブラリが簡単に利用できるように。 hatsusato C++11
  • 13. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 標準ライブラリも大きく拡充され、たくさんの便利なラ イブラリが簡単に利用できるように。 それでいて実行時速度は変わらないか、むしろ速く なった。 hatsusato C++11
  • 14. C++11 is 何? C++11 でできること .. C++11 is 何? C++11 とは、2011 年に標準化された C++の最新規格の ことである。 それまでの C++03 とは比べ物にならないほどまともに なった。これで一人前の言語に。 コア言語の機能が拡張され、今までに出来なかったり、 面倒くさい遠回りをして実現していたたくさんのことが 簡単にできるように。 標準ライブラリも大きく拡充され、たくさんの便利なラ イブラリが簡単に利用できるように。 それでいて実行時速度は変わらないか、むしろ速く なった。 要するに C++11 最高。 hatsusato C++11
  • 15. C++11 is 何? C++11 でできること .. C++11 でできること auto range-based for initializer list nullptr lambda expression move semantics constexpr useful and powerful libraries 時間の都合により割愛します。 and more! hatsusato C++11
  • 16. C++11 is 何? C++11 でできること .. auto hatsusato C++11
  • 17. C++11 is 何? C++11 でできること .. auto . これまで .. ...... for(std :: vector <std ::pair <std:: string ,std :: string > >:: const_iterator it=v.begin (); it!=v.end (); ++it){ // do something. } 変数を初期化する際には、必ず変数の型を明示的に指定 する必要があるが、時には複雑な型名を書かなければな らないことがある。 特にテンプレートが絡むと、右辺の式の型がどんな型に なるのかを知ることが困難になることがある。 しかし、いずれにせよ右辺の式の型は一意に定まるので 変数の型は自明である。 hatsusato C++11
  • 18. C++11 is 何? C++11 でできること .. auto . これから .. ...... for(auto it=std :: begin(v); it!= std :: end(v); ++it){ // do something. } C++は型推論を手に入れた! コンパイラは右辺の式の型を知っているので、自動的に auto を右辺の式の型に置き換えてくれる。 素人から玄人まで、誰でも簡単に使えて誰でも利益を享 受できるので、どんどん使いましょう。 hatsusato C++11
  • 19. C++11 is 何? C++11 でできること .. auto . これまで .. ...... for(std :: vector <std ::pair <std:: string ,std :: string > >:: const_iterator it=v.begin (); it!=v.end (); ++it){ // do something. } . これから .. ...... for(auto it=std :: begin(v); it!= std :: end(v); ++it){ // do something. } hatsusato C++11
  • 20. C++11 is 何? C++11 でできること .. range-based for hatsusato C++11
  • 21. C++11 is 何? C++11 でできること .. range-based for . これまで .. ...... for(std :: vector <std ::string >:: const_iterator vit=v.begin (); vit !=v.end (); ++vit){ for(std :: string :: const_iterator sit=vit ->begin (); sit!= vit ->end (); ++ sit ){ // do something. } } コンテナ内の全要素を走査するといったことは頻繁に起 こるが、そのたびにイテレータを作る必要があり、可読 性の低いコードになってしまう。 イテレータはポインタのようなものなので、いちいち間 接参照する必要がある。コンテナのコンテナを走査した りすると可読性を著しく損なう。 hatsusato C++11
  • 22. C++11 is 何? C++11 でできること .. range-based for . これから .. ...... for(auto vx : v){ for(auto sx : vx){ // do something. } } コンテナの全要素を走査したい時であれば、いちいちイ テレータを作る必要がなくなった。前述の auto を併用す ることでコンテナの要素の型を指定する必要もない。 コンテナの各要素を参照で受け取れるので、イテレータ の時と違って間接参照する必要がなく、コンテナのコン テナの走査も難なく書ける。 これも簡単に使えるのでどんどん使いましょう。 hatsusato C++11
  • 23. C++11 is 何? C++11 でできること .. range-based for . これまで .. ...... for(std :: vector <std ::string >:: const_iterator vit=v.begin (); vit !=v.end (); ++vit){ for(std :: string :: const_iterator sit=vit ->begin (); sit!= vit ->end (); ++ sit ){ // do something. } } . これから .. ...... for(auto vx : v){ for(auto sx : vx){ // do something. } } hatsusato C++11
  • 24. C++11 is 何? C++11 でできること .. initializer list hatsusato C++11
  • 25. C++11 is 何? C++11 でできること .. initializer list . これまで .. ...... int tmp []={13 ,22 ,37 ,41 ,58}; std :: vector <int > v(tmp ,tmp +5); // vに13 ,22 ,37 ,41 ,58 を 格 納 す る 。 v.clear (); v.push_back (13); v.push_back (22); v.push_back (37); v.push_back (41); v.push_back (58); // vに13 ,22 ,37 ,41 ,58 を 格 納 し な お す 。 コンテナをいくつかのデータで初期化するためには、現 状では上記のように一時的に配列を作ったり、push back を並べたりする必要があり、可読性があまりよくない。 hatsusato C++11
  • 26. C++11 is 何? C++11 でできること .. initializer list . これから .. ...... std :: vector <int > v={13 ,22 ,37 ,41 ,58}; 可読性がよい。 従来の構造体や配列の初期化と同じ構文であり、また通 常のコンストラクタも {} で呼び出せるようになったの で、「初期化は {}、関数呼び出しは ()」というように役 割分担することでコードがより明確になる。 変数の初期化の場面で {} をどんどん使いましょう。 hatsusato C++11
  • 27. C++11 is 何? C++11 でできること .. initializer list . これまで .. ...... int tmp []={13 ,22 ,37 ,41 ,58}; std :: vector <int > v(tmp ,tmp +5); // vに13 ,22 ,37 ,41 ,58 を 格 納 す る 。 v.clear (); v.push_back (13); v.push_back (22); v.push_back (37); v.push_back (41); v.push_back (58); // vに13 ,22 ,37 ,41 ,58 を 格 納 し な お す 。 . これから .. ...... std :: vector <int > v={13 ,22 ,37 ,41 ,58}; hatsusato C++11
  • 28. C++11 is 何? C++11 でできること .. nullptr hatsusato C++11
  • 29. C++11 is 何? C++11 でできること .. nullptr . これまで .. ...... // 関 数 オ ー バ ー ロ ー ド void f(int ){ std ::cout <<"f(int)"<<std :: endl ;} void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;} f(NULL ); // コ ン パ イ ル エ ラ ー : 曖 昧 な オ ー バ ー ロ ー ド そもそも C では #define NULL ((void*)0) となっているが、C++では (void*) から任意のポインタ への暗黙変換ができない。そのため、C++11 以前では #define NULL 0 となっていた。よって、NULL を数値の (int)0 と解釈す べきか、ヌルポインタの (int*)0 と解釈すべきか曖昧に なってしまう。 hatsusato C++11
  • 30. C++11 is 何? C++11 でできること .. nullptr . これから .. ...... // 関 数 オ ー バ ー ロ ー ド void f(int ){ std ::cout <<"f(int)"<<std :: endl ;} void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;} f(nullptr ); // > f(int *) C++11 からは任意のポインタへ暗黙変換可能な nullptr t 型のキーワード nullptr が追加され、ややこ しい問題はなくなった。 もはや NULL を使う意味はありません。ヌルポインタを使 いたいところには nullptr を使いましょう。 hatsusato C++11
  • 31. C++11 is 何? C++11 でできること .. nullptr . 関数定義 .. ...... // 関 数 オ ー バ ー ロ ー ド void f(int ){ std ::cout <<"f(int)"<<std :: endl ;} void f(int *){ std ::cout <<"f(int *)"<<std :: endl ;} . これまで .. ...... f(NULL ); // コ ン パ イ ル エ ラ ー : 曖 昧 な オ ー バ ー ロ ー ド . これから .. ...... f(nullptr ); // > f(int *) hatsusato C++11
  • 32. C++11 is 何? C++11 でできること .. lambda expression hatsusato C++11
  • 33. C++11 is 何? C++11 でできること .. lambda expression . これまで .. ...... struct AbsoluteLess { bool operator ()( int lhs , int rhs){ return std :: abs(lhs)<std :: abs(rhs ); } }; std :: sort(v.begin (), v.end(), AbsoluteLess ()); // 絶 対 値 の 大 小 で ソ ー ト C++11 以前はアルゴリズムごとに関数や関数オブジェク トを作る必要があった。たとえ一度きりしか使わないア ルゴリズムであってもいちいち関数(オブジェクト)を 作っていたが、この方法は記述量が多く、コードの流れ がわかりづらい。また、名前空間中に余分な名前があふ れることにつながる。 hatsusato C++11
  • 34. C++11 is 何? C++11 でできること .. lambda expression . これから .. ...... std :: sort(std :: begin(v), std ::end(v), []( int lhs , int rhs)->bool {return std ::abs(lhs)<std:: abs(rhs );}); ラムダ式の登場により、アルゴリズムを表す関数(オブ ジェクト)を作る代わりにラムダ式(つまり無名関数オ ブジェクト)で代用できるようになった。これにより余 分な名前が名前空間にはびこることなくコードをすっき りと書くことができるようになった。 hatsusato C++11
  • 35. C++11 is 何? C++11 でできること .. lambda expression . これまで .. ...... struct AbsoluteLess { bool operator ()( int lhs , int rhs){ return std :: abs(lhs)<std :: abs(rhs ); } }; std :: sort(v.begin (), v.end(), AbsoluteLess ()); // 絶 対 値 の 大 小 で ソ ー ト . これから .. ...... std :: sort(std :: begin(v), std ::end(v), []( int lhs , int rhs)->bool {return std ::abs(lhs)<std:: abs(rhs );}); hatsusato C++11
  • 36. C++11 is 何? C++11 でできること .. move semantics hatsusato C++11
  • 37. C++11 is 何? C++11 でできること .. move semantics . MyString クラス .. ...... class MyString{ char* _data; size_t _size; public: MyString(const MyString& str) // copy constructor :_data(new char[str._size ]), _size(str._size ){ std:: copy(str._data , str._data+_size , _data ); } MyString(MyString && str) // move constructor :_data(str._data), _size(str._size ){ str._data=nullptr; str._size =0; } // other functions ... }; hatsusato C++11
  • 38. C++11 is 何? C++11 でできること .. move semantics . これまで .. ...... MyString :: MyString(const MyString& str) :_data(new char[str._size ]), _size(str._size ){ std :: copy(str._data , str._data+_size , _data ); } C++11 以前はデータの複製を作る際には、いたる所でコ ピーが行われていた。それが当たり前だった。 hatsusato C++11
  • 39. C++11 is 何? C++11 でできること .. move semantics . これから .. ...... MyString :: MyString(MyString && str) :_data(str._data), _size(str._size ){ str._data=nullptr; str._size =0; } C++11 では右辺値参照という概念が追加され、より効率 のよいデータの複製方法が提供されるようになった。 関数の戻り値などの、代入することのできないオブジェ クトを右辺値と呼ぶ。move とは右辺値を複製する際に コピーをせず、ポインタの付け替えなどによってデータ を移譲する技術のことである。 hatsusato C++11
  • 40. C++11 is 何? C++11 でできること .. move semantics . これから .. ...... MyString :: MyString(MyString && str) :_data(str._data), _size(str._size ){ str._data=nullptr; str._size =0; } move は主にユーザコード側ではなくライブラリ提供側 が利用する技術なので、ユーザコードを特に変更するこ となく恩恵を受けられる。 STL などの右辺値参照に対応したライブラリを用いた コードの実行時速度が、C++11 としてコンパイルするだ けで、知らず知らずのうちに向上する。 move semantics 素晴らしい。 hatsusato C++11
  • 41. C++11 is 何? C++11 でできること .. constexpr hatsusato C++11
  • 42. C++11 is 何? C++11 でできること .. constexpr . これまで .. ...... #define CUBE(x) (x*x*x) #define SIDE_SIZE (10) #define ARRAY_SIZE (CUBE(SIDE_SIZE )) double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列 C++11 以前は、配列の要素数として使えるのは、整数定 数または整数定数で初期化された const な変数と整数定 数で#define したシンボルのみであった。 定数から計算して得られる結果は定数では無いので、そ の結果を const 変数に代入しても、配列の要素数として は使えない。 かわりに上記のようにして表現することは出来るが、 #define は型安全では無いので、C++において使うのは できるだけ避けるべきである。 hatsusato C++11
  • 43. C++11 is 何? C++11 でできること .. constexpr . これから .. ...... constexpr int Cube(int x){ return x*x*x;} constexpr int SIDE_SIZE =10; constexpr int ARRAY_SIZE=Cube(SIDE_SIZE ); double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列 C++11 から constexpr というキーワードが追加され、コ ンパイル時定数とコンパイル時関数を定義することがで きるようになった。 コンパイル時定数にはコンパイル時に決定可能な値を指 定することができ、コンパイル時にその値に置き換えら れる。 hatsusato C++11
  • 44. C++11 is 何? C++11 でできること .. constexpr . これから .. ...... constexpr int Cube(int x){ return x*x*x;} constexpr int SIDE_SIZE =10; constexpr int ARRAY_SIZE=Cube(SIDE_SIZE ); double array[ARRAY_SIZE ]; // 10^3 個 の 値 を 格 納 す る 配 列 コンパイル時関数は関数内で記述できる処理が制限され ているものの、全ての引数がコンパイル時定数ならば戻 り値がコンパイル時に計算され、コンパイル時定数や const 定数の初期化に使うことができる。引数の一部が 実行時に決定される場合は、コンパイルエラーになるこ となく、実行時に計算される。 上記のようにコンパイル時関数には戻り値の型があり、 型安全である。 hatsusato C++11
  • 45. C++11 is 何? C++11 でできること .. 便利なライブラリ群 スマートポインタ (shared ptr, weak ptr, unique ptr) 擬似乱数生成 (メルセンヌツイスタなど) 正規表現 ハッシュ表 (unordered map, unordered set) スレッドライブラリ その他たくさんの便利機能追加修正 またの機会に。 hatsusato C++11
  • 46. C++11 is 何? C++11 でできること .. C++11 の利用方法 hatsusato C++11
  • 47. C++11 is 何? C++11 でできること .. C++11 の利用方法 C++11 はつい最近確定したばかりの巨大な規格なので、 C++11 対応したコンパイラはまだ少ないのが現状です。 hatsusato C++11
  • 48. C++11 is 何? C++11 でできること .. C++11 の利用方法 C++11 はつい最近確定したばかりの巨大な規格なので、 C++11 対応したコンパイラはまだ少ないのが現状です。 例えば gcc では、gcc4.3 以降で-std=c++11 オプション (-std=c++11 の c は小文字なので注意)を指定すること で C++11 のコードとしてコンパイルできるようになって います。 hatsusato C++11
  • 49. C++11 is 何? C++11 でできること .. C++11 の利用方法 C++11 はつい最近確定したばかりの巨大な規格なので、 C++11 対応したコンパイラはまだ少ないのが現状です。 例えば gcc では、gcc4.3 以降で-std=c++11 オプション (-std=c++11 の c は小文字なので注意)を指定すること で C++11 のコードとしてコンパイルできるようになって います。 ちなみに今回のスライドのコードスニペットは gcc version 4.7.2 で実行確認しました。 hatsusato C++11
  • 50. C++11 is 何? C++11 でできること .. C++11 の利用方法 C++11 はつい最近確定したばかりの巨大な規格なので、 C++11 対応したコンパイラはまだ少ないのが現状です。 例えば gcc では、gcc4.3 以降で-std=c++11 オプション (-std=c++11 の c は小文字なので注意)を指定すること で C++11 のコードとしてコンパイルできるようになって います。 ちなみに今回のスライドのコードスニペットは gcc version 4.7.2 で実行確認しました。 もはや C++03 でコードを書くことは大きな損失に他なり ません。これから C++を使うときは是非 C++11 を使い ましょう。 hatsusato C++11
  • 51. C++11 is 何? C++11 でできること .. まとめ C++11 は書きやすく、読みやすく、また速いコードを簡 単に書くことができる!素晴らしい! hatsusato C++11
  • 52. C++11 is 何? C++11 でできること .. 訂正 //do something. の部分で v に対して変更を加えないのであ れば、auto ではなくて、const auto であるべき。 . auto .. ...... for(const auto it=std:: begin(v); it!=std:: end(v); ++it){ // do something. } . range-based for .. ...... for(const auto& vx : v){ for(const auto& sx : vx){ // do something. } } hatsusato C++11