SlideShare a Scribd company logo
1 of 36
Download to read offline
最近のC++

Sapporo.cpp
2013/12/07
1
2013年12月7日土曜日
あわせて読みたい

✤

C++標準化委員会の江添さんの資料
✤

http://ezoeryou.github.io/cpp-history/index.html#/

2
2013年12月7日土曜日
C++とは

✤

✤

Bjarne Stroustrupが開発した、
静的型付きマルチパラダイム言語
以下のようなパラダイムをサポート
✤

手続き的プログラミング

✤

オブジェクト指向プログラミング

✤

ジェネリックプログラミング

3
2013年12月7日土曜日
C++の歴史
✤

C with Classes

✤

C++98

✤

C++14

✤

C++ (Release 1.0)

✤

C++03

✤

C++17

✤

C++ (Release 2.0)

✤

C++ TR1

✤

C++ (Release 3.0)

✤

C++11

4
2013年12月7日土曜日
C++の歴史
✤

C with Classes
✤

1980年頃

✤

クラス/派生クラスの機能
✤

仮想関数はまだ無い

✤

コンストラクタ/デストラクタ

✤

friendクラス

✤

インライン関数

✤

関数のデフォルト引数

✤

代入演算子のオーバーロード

✤

などなど
5

2013年12月7日土曜日
C++の歴史

✤

C with ClassesからC++へ
✤

1983年頃

6
2013年12月7日土曜日
C++の歴史
✤

C++ (Release 1.0)
✤

1986年

✤

仮想関数

✤

関数名/演算子のオーバーロード

✤

参照

✤

定数
✤

readonlyキーワード(現在のconstに相当)

✤

一行コメント

✤

などなど
7

2013年12月7日土曜日
C++の歴史
✤

C++ (Release 2.0)
✤

1989年

✤

多重継承

✤

抽象クラス

✤

staticメンバ関数

✤

constメンバ関数

✤

抽象クラス(純粋仮想関数)

✤

->演算子のオーバーロード

✤

protectedメンバ

✤

などなど
8

2013年12月7日土曜日
C++の歴史

✤

C++ (Release 3.0)
✤

1991年

✤

テンプレート

✤

例外処理 (Release 3.0の変種にて)

9
2013年12月7日土曜日
C++の歴史
✤

ANSI/ISO 標準規格草案
✤

1996年

✤

名前空間

✤

mutableキーワード

✤

メンバテンプレート

✤

実行時型情報

✤

bool型

✤

などなど
10

2013年12月7日土曜日
C++の歴史

✤

C++98
✤

ISO/IEC 14882:1998

✤

C++初の標準規格

11
2013年12月7日土曜日
C++の歴史

✤

C++03
✤

ISO/IEC 14882:2003

✤

C++98のバグフィックス的なもの

12
2013年12月7日土曜日
C++の歴史
✤

C++ TR1
✤

✤

✤

ISO/IEC TR 19768:2007
Draft Technical Report on C++ Librarie Extensions
C++のこれまでの知見を元に、
ハッシュテーブルやスマートポインタなど、
ライブラリ関係で今後のC++標準に
追加されるであろう機能をまとめたもの。
→若干の修正を経て、実際に、
この次の規格 C++11 に追加された。
13

2013年12月7日土曜日
現在のC++

✤

C++11
✤

ISO/IEC 14882:2011

✤

現在のC++の標準規格

✤

✤

C++03から言語機能を大幅に拡張しつつ、過去との互換
性は最大限残している
規格策定前は C++0x と呼ばれていた

14
2013年12月7日土曜日
C++03 → C++11
✤

言語機能の追加
✤

ムーブセマンティクス

✤

auto, decltypeなど型推論の機能

✤

定数式(constexpr)

✤

Range-based for

✤

ラムダ式

✤

nullptr

✤

override/final

✤

可変長テンプレート

✤

などなど
15

2013年12月7日土曜日
C++03 → C++11
✤

ライブラリの追加
✤

<array> : 配列クラス

✤

<atomic> : アトミック変数

✤

<thread>/<mutex>/<future> : マルチスレッド関係

✤

<chrono> : 時間計算

✤

<unordered_map> : ハッシュマップ

✤

<random> : 乱数ライブラリ

✤

<regex> : 正規表現

✤

<function> : 関数オブジェクトクラス

✤

などなど
16

2013年12月7日土曜日
C++11の利点

✤

C++03からC++11になってどんなことが可能に
なったか。
✤

ムーブセマンティクスによって効率的なプログラミング

✤

ラムダ式によって直感的なプログラミング

✤

Range-based forによって簡潔なプログラミング

17
2013年12月7日土曜日
std::vector<Data>
	 
ReadData(std::string	 filepath)
{
	 	 	 	 std::ifstream	 ifs(filepath.c_str());
	 	 	 	 std::vector<Data>	 ret;


//!	 何らかのデータ読み込み
	 	 	 	 for(	 ;	 ;	 )	 {
	 	 	 	 	 	 	 	 Data	 d	 =	 read_one_data(ifs);
	 	 	 	 	 	 	 	 if(!ifs)	 {	 break;	 }
	 	 	 	 	 	 	 	 ret.push_back(std::move(d));	 	 //	 ムーブ
	 	 	 	 }
	 	 	 	 return	 ret;	 //	 戻り値は暗黙的に自動でムーブ
}
std::vector<Data>	 file_data	 =
	 	 	 	 ReadData("DataFile.dat");
	 	 	 	 	 	 	 	 
18
2013年12月7日土曜日
std::vector<Data>
	 
ReadData(std::string	 filepath)
{
	 	 	 	 std::ifstream	 ifs(filepath.c_str());
	 	 	 	 std::vector<Data>	 ret;


//!	 何らかのデータ読み込み
	 	 	 	 for(	 ;	 ;	 )	 {
	 	 	 	 	 	 	 	 Data	 d	 =	 read_one_data(ifs);
	 	 	 	 	 	 	 	 if(!ifs)	 {	 break;	 }
	 	 	 	 	 	 	 	 ret.push_back(std::move(d));	 	 //	 ムーブ
	 	 	 	 }
	 	 	 	 return	 ret;	 //	 戻り値は暗黙的に自動でムーブ
}

ムーブ可能な型は、ムーブの文脈においてコピーよりも効率

的な所有権の移動を実現する。
std::vector<Data>	 file_data	 =
	 	 	 	 ReadData("DataFile.dat");
vectorでは、コピーの代わりにムーブを使用すると、内部
	 	 	 	 	 	 	 	 
の配列データを指すポインタだけを移しかえたりする。

19
2013年12月7日土曜日
std::thread	 th(
	 	 	 	 //	 スレッドで行う処理をラムダ式で指定
	 	 	 	 [](std::vector<Data>	 data)	 {
	 	 	 	 	 	 	 	 ProcessData(data);
	 	 	 	 });
	 	 	 	 

20
2013年12月7日土曜日
std::thread	 th(
	 	 	 	 //	 スレッドで行う処理をラムダ式で指定
	 	 	 	 [](std::vector<Data>	 data)	 {
	 	 	 	 	 	 	 	 ProcessData(data);
	 	 	 	 });
	 	 	 	 
std::threadクラスは、コンストラクタで
th.join();

関数や関数オブジェクトやラムダ式のような
”呼び出し可能な何か”を受け取り、
それを別スレッドで呼び出す。

21
2013年12月7日土曜日
template<class	 Container>
void	 ProcessData(Container	 &container)
{
	 	 	 	 //	 Range-based	 forですべての要素を辿る
	 
for(Data	 &data:	 container)	 {
	 	 	 	 	  process_one_data(data);
	 	 	 	 	  std::cout	 <<	 data.result()	 <<	 std::endl;
	 	 	 	 }
}

22
2013年12月7日土曜日
template<class	 Container>
void	 ProcessData(Container	 &container)
{
	 	 	 	 //	 Range-based	 forですべての要素を辿る
	 
for(Data	 &data:	 container)	 {
	 	 	 	 	  process_one_data(data);
	 	 	 	 	  std::cout	 <<	 data.result()	 <<	 std::endl;
	 	 	 	 }
}
Range-based forは配列やbegin(), end()メ
ンバ関数を持つクラスなどからすべての要素
を渡る。

23
2013年12月7日土曜日
これからのC++

✤

C++14

✤

C++17

24
2013年12月7日土曜日
C++14

✤

✤

2014年策定を目指して作業が進んでいるC++の
新しい規格
C++11の言語仕様に対する、バグフィックスと
いくつかの改善(C++98に対するC++03のよう
なもの)

25
2013年12月7日土曜日
C++14
✤

言語機能
✤

2進数リテラルサポート

✤

数値区切り

✤

実行時サイズ配列(VLA)

✤

汎用ラムダキャプチャー

✤

[[deprecated]]

✤

関数の戻り値の型推定

✤

constexpr関数の制限緩和

✤

などなど
26

2013年12月7日土曜日
C++14
✤

ライブラリ
✤

make_unique()

✤

コンパイル時整数シーケンス

✤

共有ロック

✤

exchange()関数

✤

エイリアステンプレート版のType Traits

✤

std::complexのユーザー定義リテラル

✤

文字列オブジェクトリテラル

✤

時間リテラル

✤

などなど
27

2013年12月7日土曜日
C++14まとめ記事

✤

「C++14の新機能」
http://ezoeryou.github.io/kabukiza-tech2-slide/#/

✤

「C++14にやってくる見た目に分かりやすい新機能」
http://cpplover.blogspot.jp/2013/05/c14.html

✤

「C++14の言語拡張まとめ」
http://d.hatena.ne.jp/faith_and_brave/20131122/1385094436

28
2013年12月7日土曜日
C++17

✤

✤

✤

C++の次のメジャーアップデートとして予定され
ている規格
ただし、2017年に策定されると決まっているわ
けではない
以前はC++1yと呼ばれていた

29
2013年12月7日土曜日
C++17までのプロセス
✤

C++14とその後に続く言語仕様の策定作業と並
行して、TS(Technical Specification)と呼ばれる、特定の
機能に話題を絞ったドキュメントを作成
✤

Filesystem TS

✤

Networking TS

✤

Concepts Lite TS

✤

Library Fundamentals TS

✤

Array Extensions TS

✤

Extensions of Concurrency

✤

Extensions of Parallelism
30

2013年12月7日土曜日
例)Filesystem TS

✤

Boost.Filesystemを元に設計
✤

http://www.open-std.org/jtc1/sc22/wg21/docs/
papers/2013/n3803.pdf

31
2013年12月7日土曜日
namespace	 fs	 =	 boost::filesystem;
int	 main()
{
	 	 	 	 const	 fs::path	 path("dir1/a.txt");	 //	 コピー元
	 	 	 	 const	 fs::path	 dest("dir2/a.txt");	 //	 コピー先
	 	 	 	 try	 {
	 	 	 	 	 	 	 	 fs::copy_file(path,	 dest);
	 	 	 	 }
	 	 	 	 catch	 (fs::filesystem_error&	 ex)	 {
	 	 	 	 	 	 	 	 std::cout	 <<	 ex.what()	 <<	 std::endl;
	 	 	 	 	 	 	 	 throw;
	 	 	 	 }
}
※)Boost.Filesystemの例

32
2013年12月7日土曜日
例)Parallelism TS

✤

CUDAのThrustライブラリの設計を参考に、
STLのアルゴリズムに並列計算の機能を加える

33
2013年12月7日土曜日
std::vector<int>	 vec	 =	 ...
//	 これまで通りの、シーケンシャルソート
std::sort(vec.begin(),	 vec.end());
//	 明示的なシーケンシャルソート
std::sort(std::seq,	 vec.begin(),	 vec.end());
//	 並列実行の許可
std::sort(std::par,	 vec.begin(),	 vec.end());

34
2013年12月7日土曜日
C++17

✤

2017年を目指し、新たな言語仕様とTSとを統合
して、メジャーアップデート

35
2013年12月7日土曜日
ロードマップ

http://isocpp.org/std/status

36
2013年12月7日土曜日

More Related Content

Viewers also liked

Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
Hiro H.
 
GitHubで雑誌・書籍を作る
GitHubで雑誌・書籍を作るGitHubで雑誌・書籍を作る
GitHubで雑誌・書籍を作る
Naonori Inao
 
Decksetがよかった話
Decksetがよかった話Decksetがよかった話
Decksetがよかった話
Kohki Miki
 

Viewers also liked (17)

rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!
 
オーディオ用レベルメータを作ってみよう
オーディオ用レベルメータを作ってみようオーディオ用レベルメータを作ってみよう
オーディオ用レベルメータを作ってみよう
 
C++用将棋ライブラリ "OpenShogiLib"の紹介
C++用将棋ライブラリ"OpenShogiLib"の紹介C++用将棋ライブラリ"OpenShogiLib"の紹介
C++用将棋ライブラリ "OpenShogiLib"の紹介
 
Study3 boost
Study3 boostStudy3 boost
Study3 boost
 
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
 
名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
 
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
GitHubで雑誌・書籍を作る
GitHubで雑誌・書籍を作るGitHubで雑誌・書籍を作る
GitHubで雑誌・書籍を作る
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Decksetがよかった話
Decksetがよかった話Decksetがよかった話
Decksetがよかった話
 
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
 

Similar to 最近のC++ @ Sapporo.cpp #5

10分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_090610分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_0906
Nobuaki Oshiro
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
Haruka Ozaki
 
(うしなわれた)Fluentd output-convert_structure
(うしなわれた)Fluentd output-convert_structure(うしなわれた)Fluentd output-convert_structure
(うしなわれた)Fluentd output-convert_structure
tod esking
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶ
Hiroshi Oyamada
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
 

Similar to 最近のC++ @ Sapporo.cpp #5 (20)

DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
 
社会ネットワーク分析第7回
社会ネットワーク分析第7回社会ネットワーク分析第7回
社会ネットワーク分析第7回
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
20130126 OpenData and Android
20130126 OpenData and Android20130126 OpenData and Android
20130126 OpenData and Android
 
JDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミングJDK8で変わるJavaプログラミング
JDK8で変わるJavaプログラミング
 
#crazy-js Quiz
#crazy-js Quiz#crazy-js Quiz
#crazy-js Quiz
 
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
 
D3js入門 - Code for Kobe 可視化勉強会資料
D3js入門 - Code for Kobe 可視化勉強会資料D3js入門 - Code for Kobe 可視化勉強会資料
D3js入門 - Code for Kobe 可視化勉強会資料
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
Learning spaerk chapter03
Learning spaerk chapter03Learning spaerk chapter03
Learning spaerk chapter03
 
10分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_090610分で分かるR言語入門ver2_0906
10分で分かるR言語入門ver2_0906
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について巨大な表を高速に扱うData.table について
巨大な表を高速に扱うData.table について
 
Mecha-Mozilla
Mecha-MozillaMecha-Mozilla
Mecha-Mozilla
 
three.js はじめましょ
three.js はじめましょthree.js はじめましょ
three.js はじめましょ
 
(うしなわれた)Fluentd output-convert_structure
(うしなわれた)Fluentd output-convert_structure(うしなわれた)Fluentd output-convert_structure
(うしなわれた)Fluentd output-convert_structure
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶ
 
Linux女子部勉強会 2012年4月21日
Linux女子部勉強会 2012年4月21日Linux女子部勉強会 2012年4月21日
Linux女子部勉強会 2012年4月21日
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 

最近のC++ @ Sapporo.cpp #5