Top Banner
ふわっふわ勉強会(2015.3.14) C++のSTLの基本: C++をもっと 楽に書くために H.Hiro Twitter: @h_hiro_ http://hhiro.net/about/
54

C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

Jul 18, 2015

Download

Technology

Hiro H.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

ふわっふわ勉強会(2015.3.14)

C++のSTLの基本:C++をもっと

楽に書くために

H.HiroTwitter: @h_hiro_

http://hhiro.net/about/

Page 2: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

自己紹介

Page 3: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

H.Hiro●情報系の研究員やってます(アルゴリズムを作ったりするのが仕事です)●趣味でもプログラム書いてます●4月から名古屋に引っ越します(別の仕事が決まりました)

Page 4: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

よろしくお願いします

Page 5: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

今回話す内容

Page 6: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++のSTL

Page 7: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

STL(StandardTemplateLibrary)

Page 8: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

想定する聴講者層

Page 9: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

●STL使い始めたばかり●C++は書いてはいるがBetter Cとしてしか使えてない●C++はそこまで慣れてないけど他にある程度使い込んでるプログラム言語がある

Page 10: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

●STL使い始めたばかり●C++は書いてはいるがBetter Cとしてしか使えてない●C++はそこまで慣れてないけど他にある程度使い込んでるプログラム言語がある

もっと楽に書くための一助に!

C++の記法って面倒?そんなことないよ

std::max_elementとかstd::sortとか使ってる?

Page 11: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

さて、今回は

Page 12: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

STLの形式ばった説明は極力しない

Page 13: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

利用例から紹介していく

Page 14: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

#include <iostream>#include <string>#include <vector>

void display_party(std::vector<std::string> & party){ std::cout << "[現在のパーティー]" << std::endl; for(auto i = party.begin(); i != party.end(); ++i){ std::cout << *i << std::endl; }}

int main(void){ std::vector<std::string> current_party; current_party.push_back("勇者"); current_party.push_back("魔法使い"); current_party.push_back("遊び人"); display_party(current_party);

}

Page 15: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

#include <iostream>#include <string>#include <vector>

void display_party(std::vector<std::string> & party){ std::cout << "[現在のパーティー]" << std::endl; for(auto i = party.begin(); i != party.end(); ++i){ std::cout << *i << std::endl; }}

int main(void){ std::vector<std::string> current_party; current_party.push_back("勇者"); current_party.push_back("魔法使い"); current_party.push_back("遊び人"); display_party(current_party); current_party.erase(current_party.begin()); display_party(current_party);}

Page 16: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

何のことはない

Page 17: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

配列を操作しているだけ

Page 18: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

// 文字列型の配列を定義する// 「大きな枠組み<各個の要素>」と読むstd::vector<std::string> current_party;

// 配列に実際に文字列を追加するcurrent_party.push_back("勇者");

// 配列の先頭を削除するcurrent_party.erase(current_party.begin());

Page 19: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

ただ、これだけでは終わらない

Page 20: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

#include <iostream>#include <string>#include <vector>

struct Person{ std::string job; int level;};

void display_party(std::vector<Person> & party){ std::cout << "[現在のパーティー]" << std::endl; for(auto i = party.begin(); i != party.end(); ++i){ std::cout << i->job << "(Lv:" << i->level << ")" << std::endl; }}

int main(void){ std::vector<Person> current_party; current_party.push_back({"勇者", 30}); current_party.push_back({"魔法使い", 25}); current_party.push_back({"遊び人", 20}); display_party(current_party);}

Page 21: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

好きな型で使うことができる

(なお、いくつか条件はあり)std::vector<std::string>std::vector<int>std::vector<Person>:

Page 22: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

#include <iostream>#include <string>#include <map>

int main(void){ std::map<std::string, std::string> member_location; member_location["ろっさむ"] = "札幌"; member_location["ほっと"] = "札幌"; member_location["筒天"] = "札幌"; member_location["nawoyuki"] = "札幌"; member_location["睦月"] = "札幌"; member_location["H.Hiro"] = "札幌"; for(auto i = member_location.begin(); i != member_location.end(); ++i){ std::cout << i->first << ": " << i->second << " から来ました" << std::endl; }}

Page 23: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

連想配列など他の構造も

ある

Page 24: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

#include <iostream>#include <string>#include <vector>#include <algorithm>

struct Person{ std::string job; int level;};

void display_party(std::vector<Person> & party){ (略) }

int main(void){ std::vector<Person> current_party; current_party.push_back({"勇者", 30}); current_party.push_back({"魔法使い", 25}); current_party.push_back({"遊び人", 20}); std::sort(current_party.begin(), current_party.end(), [](const Person & a, const Person & b){ return a.level < b.level; }); display_party(current_party);}

Page 25: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

検索や並べ替えなどの処理もできる

Page 26: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

スクリプト言語だと普通の機能かもしれないけどC++でもちゃんと使えるよ!

だからみんなもっとC++使うといいと思うよ!

Page 27: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

もう少し詳しく紹介

Page 28: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

STLの構成要素

Page 29: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

●コンテナ●イテレータ●アルゴリズム●関数オブジェクト

Page 30: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

●コンテナ●イテレータ●アルゴリズム●関数オブジェクト

おそらく、上段ほどよく使われている

Page 31: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

コンテナ:値を格納するためのtemplate型※「コンテナアダプタ」というものもあるけど今回は省略

std::vector<型名>std::map<型名, 型名>:

これはよく利用される

Page 32: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

イテレータ:「繰り返し」「前(後)の要素」などの処理を抽象化したものfor(auto i = party.begin(); i != party.end(); ++i){ std::cout << *i << std::endl;}

どのコンテナでも記法は基本的に同じ

Page 33: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

アルゴリズム:「並べ替え」「最大値取得」など、複数の値に対する処理std::sort(party.begin(), party.end(), [](const Person & a, const Person & b){ return a.level < b.level; // レベルの値が低い順に並べ替え });

イテレータのおかげで、どのコンテナに対しても共通で利用できる!

Page 34: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

関数オブジェクト:「関数」を引数として渡したいときのための機構std::sort(party.begin(), party.end(), [](const Person & a, const Person & b){ return a.level < b.level; // レベルの値が高い順に並べ替え });

その場その場で自由に処理を差し替えられる

Page 35: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

関数オブジェクト:「関数」を引数として渡したいときのための機構std::sort(party.begin(), party.end(), [](const Person & a, const Person & b){ return a.job < b.job; // 職業名の順に並べ替え });

その場その場で自由に処理を差し替えられる

Page 36: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

「コンテナ」「イテレータ」は使ってる人は多そうだが

「アルゴリズム」「関数オブジェクト」

も使ってみよう!

Page 37: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

さて、私が思うに

Page 38: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

「コンテナ」「イテレータ」はともかく

「アルゴリズム」「関数オブジェクト」は以前は記法が面倒だった

Page 39: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

ということで

Page 40: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

このあたりで歴史的な話をしておきたい

Page 41: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

以前は記法が面倒だったけど今なら大丈夫!

という点を紹介しておきたい

Page 42: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++11

Page 43: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++11●現最新規格(C++14)の一つ前●さらにその前の規格(C++03)から大幅に機能を追加●現在はコンパイラもかなり対応が進んでいる

Page 44: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++11が使えるようになって、STL利用の利便性も大幅に向上

Page 45: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

1. コンテナ初期化の記法が導入され、リテラルに近い感覚で利用できるようになった<従来>std::vector<int> hoge;hoge.push_back(9); hoge.push_back(1); hoge.push_back(3);

<C++11>std::vector<int> hoge = {9, 1, 3};

Page 46: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

「連想配列のリテラル」も書けるようになった<従来>std::map<int, int> piyo;piyo[3] = 6; piyo[5] = 1; piyo[8] = 9;

<C++11>std::map<int, int> piyo = {{3, 6}, {5, 1}, {8, 9}};

Page 47: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

2. イテレータ●auto記法が導入●その関係で、constイテレータを明示的に得る方法が新設された<従来>for(std::vector<int>::const_iterator it = hoge.begin();it != hoge.end(); ++it){ ... }

<C++11>for(auto it = hoge.cbegin(); it != hoge.cend(); ++it){ ... }

Page 48: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

3. アルゴリズム/4. 関数オブジェクト●無名関数で非常に便利に<従来>struct SortByLevel{ int operator()(const Person & a, const Person & b){ return a.level < b.level; }};std::sort(party.begin(), party.end(), SortByLevel());<C++11>std::sort(party.begin(), party.end(), [](const Person & a, const Person & b){ return a.level < b.level; });

Page 49: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++11対応コンパイラを前提にコードを書けば記法が非常にすっきりする

Page 50: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

おわりに

Page 51: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

C++使っててSTLを使ってないならまずは使ってみよう

Page 52: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

STLを使っててもアルゴリズムや関数オブジェクトを

使ってないなら使ってみよう

Page 53: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

今なら、C++11が普通に使える環境も

増えてる=記法も楽ですよ

Page 54: C++のSTLの基本:C++をもっと楽に書くために @ ふわっふわ勉強会(2015.3.14)

ありがとうございました