SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
ふわっふわ勉強会(2015.3.14)
C++のSTLの基本:
C++をもっと
楽に書くために
H.Hiro
Twitter: @h_hiro_
http://hhiro.net/about/
自己紹介
H.Hiro
●情報系の研究員
やってます
(アルゴリズムを作ったり
するのが仕事です)
●趣味でもプログラム書いてます
●4月から名古屋に引っ越します
(別の仕事が決まりました)
よろしく
お願いします
今回話す内容
C++の
STL
STL
(Standard
Template
Library)
想定する
聴講者層
● STL使い始めたばかり
● C++は書いてはいるが
Better Cとしてしか使えてない
● C++はそこまで慣れてないけど
他にある程度使い込んでる
プログラム言語がある
● STL使い始めたばかり
● C++は書いてはいるが
Better Cとしてしか使えてない
● C++はそこまで慣れてないけど
他にある程度使い込んでる
プログラム言語がある
もっと楽に
書くための一助に!
C++の記法って
面倒?そんなことないよ
std::max_elementとか
std::sortとか使ってる?
さて、今回は
STLの
形式ばった説明
は極力しない
利用例から
紹介していく
#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);
}
#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);
}
何のことはない
配列を操作
しているだけ
// 文字列型の配列を定義する
// 「大きな枠組み<各個の要素>」と読む
std::vector<std::string> current_party;
// 配列に実際に文字列を追加する
current_party.push_back("勇者");
// 配列の先頭を削除する
current_party.erase(current_party.begin());
ただ、
これだけでは
終わらない
#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);
}
好きな型で
使うことができる
(なお、いくつか条件はあり)
std::vector<std::string>
std::vector<int>
std::vector<Person>
:
#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;
}
}
連想配列など
他の構造も
ある
#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);
}
検索や
並べ替えなどの
処理もできる
スクリプト言語だと
普通の機能かもしれないけど
C++でもちゃんと使えるよ!
だからみんなもっと
C++使うといいと思うよ!
もう少し
詳しく紹介
STLの構成要素
●コンテナ
●イテレータ
●アルゴリズム
●関数オブジェクト
●コンテナ
●イテレータ
●アルゴリズム
●関数オブジェクト
おそらく、
上段ほど
よく使われ
ている
コンテナ:
値を格納するためのtemplate型
※「コンテナアダプタ」というものもあるけど今回は省略
std::vector<型名>
std::map<型名, 型名>
:
これはよく利用される
イテレータ:
「繰り返し」「前(後)の要素」
などの処理を抽象化したもの
for(auto i = party.begin(); i != party.end(); ++i){
std::cout << *i << std::endl;
}
どのコンテナでも記法は基本的に
同じ
アルゴリズム:
「並べ替え」「最大値取得」
など、複数の値に対する処理
std::sort(party.begin(), party.end(),
[](const Person & a, const Person & b){
return a.level < b.level; // レベルの値が低い順に並べ替え
});
イテレータのおかげで、どのコンテナに
対しても共通で利用できる!
関数オブジェクト:
「関数」を引数として渡したい
ときのための機構
std::sort(party.begin(), party.end(),
[](const Person & a, const Person & b){
return a.level < b.level; // レベルの値が高い順に並べ替え
});
その場その場で
自由に処理を差し替えられる
関数オブジェクト:
「関数」を引数として渡したい
ときのための機構
std::sort(party.begin(), party.end(),
[](const Person & a, const Person & b){
return a.job < b.job; // 職業名の順に並べ替え
});
その場その場で
自由に処理を差し替えられる
「コンテナ」「イテレータ」は
使ってる人は多そうだが
「アルゴリズム」
「関数オブジェクト」
も使ってみよう!
さて、私が思うに
「コンテナ」「イテレータ」は
ともかく
「アルゴリズム」
「関数オブジェクト」は
以前は記法が面倒だった
ということで
このあたりで
歴史的な話を
しておきたい
以前は記法が
面倒だったけど
今なら大丈夫!
という点を
紹介しておきたい
C++11
C++11
● 現最新規格(C++14)の一つ前
● さらにその前の規格(C++03)
から大幅に機能を追加
● 現在はコンパイラも
かなり対応が進んでいる
C++11が使えるように
なって、STL利用の
利便性も大幅に向上
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};
「連想配列のリテラル」も
書けるようになった
<従来>
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}};
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){ ... }
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; });
C++11対応コンパイラを
前提にコードを書けば
記法が非常に
すっきりする
おわりに
C++使ってて
STLを使ってないなら
まずは使ってみよう
STLを使ってても
アルゴリズムや
関数オブジェクトを
使ってないなら
使ってみよう
今なら、C++11が
普通に使える環境も
増えてる
=記法も楽ですよ
ありがとう
ございました

Más contenido relacionado

Más de Hiro H.

PCSじゃないよ、PCAだよ
PCSじゃないよ、PCAだよPCSじゃないよ、PCAだよ
PCSじゃないよ、PCAだよHiro H.
 
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~Hiro H.
 
スマホ音楽ゲームの動画から譜面をデータ化したかった
スマホ音楽ゲームの動画から譜面をデータ化したかったスマホ音楽ゲームの動画から譜面をデータ化したかった
スマホ音楽ゲームの動画から譜面をデータ化したかったHiro H.
 
シンデレラガールズ声優の増え方まとめ
シンデレラガールズ声優の増え方まとめシンデレラガールズ声優の増え方まとめ
シンデレラガールズ声優の増え方まとめHiro H.
 
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」Hiro H.
 
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」Hiro H.
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Hiro H.
 
最近デレステ創作譜面作ってるので技術的な見地から話します
最近デレステ創作譜面作ってるので技術的な見地から話します最近デレステ創作譜面作ってるので技術的な見地から話します
最近デレステ創作譜面作ってるので技術的な見地から話しますHiro H.
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようHiro H.
 
デレステの劇場で登場したアイドルの回数の統計取ってます
デレステの劇場で登場したアイドルの回数の統計取ってますデレステの劇場で登場したアイドルの回数の統計取ってます
デレステの劇場で登場したアイドルの回数の統計取ってますHiro H.
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗Hiro H.
 
MSYS2使いはじめました
MSYS2使いはじめましたMSYS2使いはじめました
MSYS2使いはじめましたHiro H.
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へHiro H.
 
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみるHiro H.
 
rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!Hiro H.
 
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】Hiro H.
 
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)Hiro H.
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法Hiro H.
 

Más de Hiro H. (20)

PCSじゃないよ、PCAだよ
PCSじゃないよ、PCAだよPCSじゃないよ、PCAだよ
PCSじゃないよ、PCAだよ
 
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
 
スマホ音楽ゲームの動画から譜面をデータ化したかった
スマホ音楽ゲームの動画から譜面をデータ化したかったスマホ音楽ゲームの動画から譜面をデータ化したかった
スマホ音楽ゲームの動画から譜面をデータ化したかった
 
シンデレラガールズ声優の増え方まとめ
シンデレラガールズ声優の増え方まとめシンデレラガールズ声優の増え方まとめ
シンデレラガールズ声優の増え方まとめ
 
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
 
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
 
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
 
最近デレステ創作譜面作ってるので技術的な見地から話します
最近デレステ創作譜面作ってるので技術的な見地から話します最近デレステ創作譜面作ってるので技術的な見地から話します
最近デレステ創作譜面作ってるので技術的な見地から話します
 
C++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみようC++のライブラリを簡単に眺めてみよう
C++のライブラリを簡単に眺めてみよう
 
デレステの劇場で登場したアイドルの回数の統計取ってます
デレステの劇場で登場したアイドルの回数の統計取ってますデレステの劇場で登場したアイドルの回数の統計取ってます
デレステの劇場で登場したアイドルの回数の統計取ってます
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗名古屋市営地下鉄最小距離完乗
名古屋市営地下鉄最小距離完乗
 
MSYS2使いはじめました
MSYS2使いはじめましたMSYS2使いはじめました
MSYS2使いはじめました
 
関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ関数の最小値を求めることから機械学習へ
関数の最小値を求めることから機械学習へ
 
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
 
rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!rsyncで差分バックアップしようぜ!
rsyncで差分バックアップしようぜ!
 
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
 
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
 

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