Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Hiro H.
PDF, PPTX
4,198 views
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Ohotech 特盛 #10(2014.8.30)にて http://ohotech.connpass.com/event/7517/
Technology
◦
Read more
5
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 101
2
/ 101
3
/ 101
4
/ 101
5
/ 101
6
/ 101
7
/ 101
8
/ 101
9
/ 101
10
/ 101
11
/ 101
12
/ 101
13
/ 101
14
/ 101
15
/ 101
16
/ 101
17
/ 101
18
/ 101
19
/ 101
20
/ 101
21
/ 101
22
/ 101
23
/ 101
24
/ 101
25
/ 101
26
/ 101
27
/ 101
28
/ 101
29
/ 101
30
/ 101
31
/ 101
32
/ 101
33
/ 101
34
/ 101
35
/ 101
36
/ 101
37
/ 101
38
/ 101
39
/ 101
40
/ 101
41
/ 101
42
/ 101
43
/ 101
44
/ 101
45
/ 101
46
/ 101
47
/ 101
48
/ 101
49
/ 101
50
/ 101
51
/ 101
52
/ 101
53
/ 101
54
/ 101
55
/ 101
56
/ 101
57
/ 101
58
/ 101
59
/ 101
60
/ 101
61
/ 101
62
/ 101
63
/ 101
64
/ 101
65
/ 101
66
/ 101
67
/ 101
68
/ 101
69
/ 101
70
/ 101
71
/ 101
72
/ 101
73
/ 101
74
/ 101
75
/ 101
76
/ 101
77
/ 101
78
/ 101
79
/ 101
80
/ 101
81
/ 101
82
/ 101
83
/ 101
84
/ 101
85
/ 101
86
/ 101
87
/ 101
88
/ 101
89
/ 101
90
/ 101
91
/ 101
92
/ 101
93
/ 101
94
/ 101
95
/ 101
96
/ 101
97
/ 101
98
/ 101
99
/ 101
100
/ 101
101
/ 101
More Related Content
PDF
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
PDF
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
PDF
LR parsing
by
ichikaz3
PDF
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
PDF
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
by
Genya Murakami
PDF
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
PDF
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
C++コミュニティーの中心でC++をDISる
by
Hideyuki Tanaka
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
by
Yoshifumi Kawai
今日からできる!簡単 .NET 高速化 Tips
by
Takaaki Suzuki
LR parsing
by
ichikaz3
MagicOnion~C#でゲームサーバを開発しよう~
by
torisoup
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
by
Genya Murakami
20分くらいでわかった気分になれるC++20コルーチン
by
yohhoy
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
What's hot
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
by
kiki utagawa
PPTX
C# 8.0 非同期ストリーム
by
信之 岩永
PDF
例外設計における大罪
by
Takuto Wada
PPTX
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
PDF
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
PDF
高速な倍精度指数関数expの実装
by
MITSUNARI Shigeo
PDF
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
by
祐司 伊藤
PDF
計算機アーキテクチャを考慮した高能率画像処理プログラミング
by
Norishige Fukushima
PDF
constexpr idioms
by
fimbul
PDF
Constexpr 中3女子テクニック
by
Genya Murakami
PDF
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
PDF
Dalvik仮想マシンのアーキテクチャ 改訂版
by
Takuya Matsunaga
PDF
Java8でRDBMS作ったよ
by
なおき きしだ
PPTX
クソザコ鳥頭が非順序連想コンテナに入門してみた
by
Mitsuru Kariya
PDF
いつやるの?Git入門 v1.1.0
by
Masakazu Matsushita
PDF
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
PDF
関数型プログラミングのデザインパターンひとめぐり
by
Kazuyuki TAKASE
PDF
カスタムメモリマネージャと高速なメモリアロケータについて
by
alwei
PDF
WebRTC と Native とそれから、それから。
by
tnoho
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
by
kiki utagawa
C# 8.0 非同期ストリーム
by
信之 岩永
例外設計における大罪
by
Takuto Wada
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
Java開発の強力な相棒として今すぐ使えるGroovy
by
Yasuharu Nakano
高速な倍精度指数関数expの実装
by
MITSUNARI Shigeo
emscriptenでC/C++プログラムをwebブラウザから使うまでの難所攻略
by
祐司 伊藤
計算機アーキテクチャを考慮した高能率画像処理プログラミング
by
Norishige Fukushima
constexpr idioms
by
fimbul
Constexpr 中3女子テクニック
by
Genya Murakami
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
Dalvik仮想マシンのアーキテクチャ 改訂版
by
Takuya Matsunaga
Java8でRDBMS作ったよ
by
なおき きしだ
クソザコ鳥頭が非順序連想コンテナに入門してみた
by
Mitsuru Kariya
いつやるの?Git入門 v1.1.0
by
Masakazu Matsushita
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
関数型プログラミングのデザインパターンひとめぐり
by
Kazuyuki TAKASE
カスタムメモリマネージャと高速なメモリアロケータについて
by
alwei
WebRTC と Native とそれから、それから。
by
tnoho
Viewers also liked
PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
by
Hiro H.
PDF
Boost.GraphでJR全線乗り尽くしプランを立てる - プログラミング生放送+CLR/H+Sapporo.cpp 勉強会@札幌 (2014.7.12)
by
Hiro H.
PDF
OpenGL 3DCG
by
Takenori Nakagawa
PDF
関数の最小値を求めることから機械学習へ
by
Hiro H.
PDF
cocos2d-xとCocosBuilderでゲームを作ってみよう
by
Tomoaki Shimizu
PDF
今Cinderが熱い! #cinder
by
KatsuyaENDOH
PDF
cocos2d-xの開発に欠かせないCocosBuilderについて
by
Tomoaki Shimizu
DOCX
Rでの対称行列の固有値・固有ベクトルの最適な求め方
by
wada, kazumi
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
by
Hiro H.
PDF
cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
PDF
Cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
PDF
Macでcocos2d-x 2.1.3を使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
KEY
Cocos2d-xのかんたんな紹介
by
Tomoaki Shimizu
ODP
The Introduction to Vector Graphics
by
emaame
KEY
Cocos2d xのススメ
by
Tomoaki Shimizu
PDF
20130912 macでcocos2d x 3.0alphaを使用した、クロスプラットフォーム開発環境構築について
by
Tomoaki Shimizu
PDF
Macでcocos2d-x 2.1.3を使用した、Androidアプリの開発環境構築について
by
Tomoaki Shimizu
PDF
cocos2d-xのサーバ連携について
by
Tomoaki Shimizu
PDF
Cocos2d xでの開発の準備
by
Tomoaki Shimizu
PDF
Math1 Vector
by
Keisuke Hata
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
by
Hiro H.
Boost.GraphでJR全線乗り尽くしプランを立てる - プログラミング生放送+CLR/H+Sapporo.cpp 勉強会@札幌 (2014.7.12)
by
Hiro H.
OpenGL 3DCG
by
Takenori Nakagawa
関数の最小値を求めることから機械学習へ
by
Hiro H.
cocos2d-xとCocosBuilderでゲームを作ってみよう
by
Tomoaki Shimizu
今Cinderが熱い! #cinder
by
KatsuyaENDOH
cocos2d-xの開発に欠かせないCocosBuilderについて
by
Tomoaki Shimizu
Rでの対称行列の固有値・固有ベクトルの最適な求め方
by
wada, kazumi
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
by
Hiro H.
cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
Cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
Macでcocos2d-x 2.1.3を使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
Cocos2d-xのかんたんな紹介
by
Tomoaki Shimizu
The Introduction to Vector Graphics
by
emaame
Cocos2d xのススメ
by
Tomoaki Shimizu
20130912 macでcocos2d x 3.0alphaを使用した、クロスプラットフォーム開発環境構築について
by
Tomoaki Shimizu
Macでcocos2d-x 2.1.3を使用した、Androidアプリの開発環境構築について
by
Tomoaki Shimizu
cocos2d-xのサーバ連携について
by
Tomoaki Shimizu
Cocos2d xでの開発の準備
by
Tomoaki Shimizu
Math1 Vector
by
Keisuke Hata
Similar to C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PPTX
競技プログラミングのためのC++入門
by
natrium11321
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
Boost.Flyweight
by
gintenlabo
PDF
C++のライブラリを簡単に眺めてみよう
by
Hiro H.
PDF
Pfi Seminar 2010 1 7
by
Preferred Networks
PDF
すごいConstたのしく使おう!
by
Akihiro Nishimura
PDF
リテラル文字列型までの道
by
Satoshi Sato
PDF
C++0x in programming competition
by
yak1ex
PDF
C++によるソート入門
by
AimingStudy
PDF
C++11のつかいかた
by
amusementcreators
PDF
C++11概要 ライブラリ編
by
egtra
PPTX
b木ノススメ
by
gotoloop
PDF
わんくま同盟大阪勉強会#61
by
TATSUYA HAYAMIZU
PPTX
2016年第二回プレ卒研in山口研
by
dmcc2015
PPT
C++0x in programming competition
by
yak1ex
PDF
研究生のためのC++ no.5
by
Tomohiro Namba
PDF
初めてのSTL
by
HCPC: 北海道大学競技プログラミングサークル
PDF
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
by
Hiro H.
PPTX
Boost.PropertyMap (.pptx)
by
Cryolite
PDF
Boost.PropertyMap (.pdf)
by
Cryolite
競技プログラミングのためのC++入門
by
natrium11321
中3女子でもわかる constexpr
by
Genya Murakami
Boost.Flyweight
by
gintenlabo
C++のライブラリを簡単に眺めてみよう
by
Hiro H.
Pfi Seminar 2010 1 7
by
Preferred Networks
すごいConstたのしく使おう!
by
Akihiro Nishimura
リテラル文字列型までの道
by
Satoshi Sato
C++0x in programming competition
by
yak1ex
C++によるソート入門
by
AimingStudy
C++11のつかいかた
by
amusementcreators
C++11概要 ライブラリ編
by
egtra
b木ノススメ
by
gotoloop
わんくま同盟大阪勉強会#61
by
TATSUYA HAYAMIZU
2016年第二回プレ卒研in山口研
by
dmcc2015
C++0x in programming competition
by
yak1ex
研究生のためのC++ no.5
by
Tomohiro Namba
初めてのSTL
by
HCPC: 北海道大学競技プログラミングサークル
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
by
Hiro H.
Boost.PropertyMap (.pptx)
by
Cryolite
Boost.PropertyMap (.pdf)
by
Cryolite
More from Hiro H.
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
by
Hiro H.
PDF
rsyncで差分バックアップしようぜ!
by
Hiro H.
PDF
式を書くだけで最適化計算してほしい!~CVXPY編~
by
Hiro H.
PDF
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
by
Hiro H.
PDF
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
by
Hiro H.
PDF
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
by
Hiro H.
PDF
MSYS2使いはじめました
by
Hiro H.
PDF
名古屋市営地下鉄最小距離完乗
by
Hiro H.
PDF
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
by
Hiro H.
PDF
スマホ音楽ゲームの動画から譜面をデータ化したかった
by
Hiro H.
PDF
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
by
Hiro H.
PDF
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
by
Hiro H.
PDF
PCSじゃないよ、PCAだよ
by
Hiro H.
PDF
最近デレステ創作譜面作ってるので技術的な見地から話します
by
Hiro H.
PDF
デレステの劇場で登場したアイドルの回数の統計取ってます
by
Hiro H.
PDF
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
by
Hiro H.
PDF
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
by
Hiro H.
PDF
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
by
Hiro H.
PDF
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
by
Hiro H.
PDF
シンデレラガールズ声優の増え方まとめ
by
Hiro H.
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
by
Hiro H.
rsyncで差分バックアップしようぜ!
by
Hiro H.
式を書くだけで最適化計算してほしい!~CVXPY編~
by
Hiro H.
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
by
Hiro H.
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
by
Hiro H.
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
by
Hiro H.
MSYS2使いはじめました
by
Hiro H.
名古屋市営地下鉄最小距離完乗
by
Hiro H.
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
by
Hiro H.
スマホ音楽ゲームの動画から譜面をデータ化したかった
by
Hiro H.
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
by
Hiro H.
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
by
Hiro H.
PCSじゃないよ、PCAだよ
by
Hiro H.
最近デレステ創作譜面作ってるので技術的な見地から話します
by
Hiro H.
デレステの劇場で登場したアイドルの回数の統計取ってます
by
Hiro H.
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
by
Hiro H.
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
by
Hiro H.
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
by
Hiro H.
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
by
Hiro H.
シンデレラガールズ声優の増え方まとめ
by
Hiro H.
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
1.
Ohotech 特盛 #10(2014.8.30)
C++のSTLの コンテナ型を概観する H.Hiro @ Sapporo.cpp Twitter: @h_hiro_ http://hhiro.net/about/
2.
自己紹介
3.
H.Hiro ●情報系の研究員 やってます
(2014年3月まで大学院生でした) ●趣味でもプログラム書いてます ●C++とかRubyとか他にも何でも
4.
IT系勉強会で北見に来るのは 2年ぶりです
5.
最近の勉強会発表 "コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を 解いてもらった方法"
@ FuraIT #3 (2014.8.23) http://www.slideshare.net/maraigue/graph-andlgpk
6.
よろしく お願いします
7.
はじめに
8.
今回知って もらえればと 思っていること
9.
1. 汎用的なデータ構造は C++だと"STL"として
提供されるということ
10.
2. どんなデータ構造を どんな場合に使えば
よいかの感覚
11.
3. "STL怖い"なんて 言わなくてよいように
なること
12.
では始めます
13.
おしながき
14.
1)STLとは 2)「データ構造」を考える理由 3)STLのコンテナ型と
それぞれの特徴 4)STLを使うと便利なこと
15.
STLとは
16.
STLとは ●Standard Template
Libraryの略 ●汎用的、かつ型に依存しない データ構造や処理(アルゴリズム) を提供する
17.
STLとは ●Standard Template
Libraryの略 ●汎用的、かつ型に依存しない データ構造や処理(アルゴリズム) を提供する
18.
Template(テンプレート)とは ●コンパイル時に有効になる クラスや関数に対するパラメータ
●型によらない機能を提供するのが 代表的な用法 template <class TYPE> TYPE max(const TYPE & v1, const TYPE & v2){ return(v1 > v2 ? v1 : v2); } max(1.0, 3.0); // TYPEはfloatとみなされる max(1, 5); // TYPEはintとみなされる max<int>(1, 5); // 型を明示してもよい
19.
STLの例 #include <iostream>
#include <vector> #include <algorithm> int main(void){ // 「intのvector」「doubleのvector」を作る // (あとで説明しますが、可変長配列です) std::vector<int> hoge = {3, 1, 4}; std::vector<double> piyo = {5.6, 1.2, 3.4}; // int/doubleの型によらず、同じ記法でソート(並べ替え)できる std::sort(hoge.begin(), hoge.end()); std::sort(piyo.begin(), piyo.end()); }
20.
●汎用的に利用されるデータ構造や アルゴリズムを自前で作るのは ミス・バグの原因にもなる
●STLが提供する機能の特性を 理解したうえで、先人の力を借りよう ●複数人で開発するときとかは特に。 (標準ライブラリなので何かと便利!)
21.
「データ構造」を 考える理由
22.
そもそも データ構造って 何なのか
23.
たとえば
24.
RPGを例に考えてみると ●パーティーの編成 (例えば「4人まで」とする)
●現在プレイヤーが持っている アイテムの一覧 ●マップ上の地形
25.
パーティーの編成 (例えば「4人まで」とする) →配列があればよい
サイズも固定でよい 職業:勇者、HP:120、… 職業:魔法使い、HP:95、… 職業:格闘家、HP:135、… 職業:僧侶、HP:110、…
26.
現在プレイヤーが持っている アイテムの一覧 →「どのアイテムを何個持って
いるか」という表 では表をどう作る? 構造体の配列にする ほかの方法もある アイテム名個数 薬草10 魔法石2 お守り3 : :
27.
マップ上の地形 →表があればよい (マス目状の配置であれば)
→線の一覧を格納する (マップが自由に描ける場合) 3Dだともっと面倒
28.
いろんな データ構造を 考えないと
ならない
29.
しかも 面倒なことに
30.
適切なデータ構造を 選ばないと 処理が遅くなったり
メモリを過剰に 消費したりする
31.
データ構造 自体はSTLが 面倒見て
くれるけど
32.
どのデータ構造 で作るかは プログラマーが
判断する
33.
この先では STLの型について そういった話を
していきます
34.
STLの コンテナ型一覧 (Part
1)
35.
コンテナ型 =(複数の)要素を 保持する型
36.
コンテナ型(1): vector 可変長配列
(あとで要素数を変えられる) vector<int> hoge = {3, 1, 4}; hoge.push_back(7); hoge.pop_front(); 3 1 4 3 1 4 7 1 4 7
37.
std::vector<int> hoge; //
↑int型の要素を // 格納するvector std::vector<std::string> piyo; // ↑string型(文字列型)の要素を // 格納するvector
38.
補足 vector<int> hoge
= {3, 1, 4}; ↑こういう書き方は、 配列ではもともとできましたが、 vector(やその他のクラス)で使うには 比較的新しいコンパイラが必要です。 (現時点での最新のC++規格 「C++11」で新規に規格化)
39.
コードはこんな感じ #include <iostream>
#include <vector> // vectorを使うために int main(void){ std::vector<int> hoge(3); // 要素数3のvector // ここでは数値を使ってループしている // 「イテレータ」を使う方法もある(あとで説明します) for(size_t i = 0; i < hoge.size(); ++i){ hoge[i] = i * i; } // (以下略) }
40.
vectorの特性(1) ●k番目の要素を取得(ランダムアクセス) →即座に完了。
vectorはメモリ上に等間隔で要素を 並べて保持しているので(配列と同じ) メモリ上のその場所にアクセスするだけ。 3 1 4 7
41.
vectorの特性(2) ●要素を1つ挿入する →大きく時間がかかる場合がある。
→もともと配列にあった要素をずらさないと ならない。 3 1 4 2番目に「5」を追加 3 5 1 4
42.
vectorの特性(2) ●要素を1つ挿入する →大きく時間がかかる場合がある。
→もともと配列にあった要素をずらさないと ならない。 →場合によっては、要素のメモリ上の 置き場所をまるごとずらす必要がある。 3 1 4 1 5 9 2 ↑二つのvectorが隣接したメモリ領域に格納されている。 ここで、「3 1 4」のほうを長くしようとすると?
43.
vectorの特性(3) ●要素を1つ削除する →挿入と同じ理屈で、
大きく時間がかかる場合がある。 3 5 1 4 「5」を削除→「1」「4」はずらす 3 1 4
44.
vectorの特性(4) ●メモリの消費量 →少ない。
変数を格納する領域+ポインタ変数2つ (領域の起点&領域のサイズ) 3 1 4 7
45.
ここまでのまとめ: vectorの利点 ●ランダムアクセスは速い
●メモリもそこまで食わない vectorの欠点 ●挿入・削除は遅い (最悪でvectorのサイズに比例)
46.
vectorの欠点 ●挿入・削除は遅い (最悪でvectorのサイズに比例)
↑これに対処してみる。
47.
コンテナ型(2): list 双方向連結リスト
要素の値 3 次の要素 前の要素 要素の値 1 次の要素 前の要素 要素の値 4 次の要素 前の要素 C++11ではforward_list (一方向連結リスト)もある
48.
listの特性(1) ●要素を1つ挿入する・削除する →ポインタを付け替えるだけでよいので
高速(ただし、挿入/削除する要素の ありかが事前にわかっている場合) 3 1 4 5
49.
listの特性(1) ●要素を1つ挿入する・削除する →ポインタを付け替えるだけでよいので
高速(ただし、挿入/削除する要素の ありかが事前にわかっている場合) 3 1 4 5
50.
listの特性(2) ●k番目の要素を取得(ランダムアクセス) →k回ポインタを辿る必要がある。
vectorに比べると非常に遅い 要素の値 3 次の要素 前の要素 要素の値 1 次の要素 前の要素 要素の値 4 次の要素 前の要素
51.
listの特性(3) ●メモリの消費量 →vectorに比べると多い。
格納する1要素につき、ポインタ変数 2つぶんの領域が追加で必要になる。 (forward_listの場合は1つ) 要素の値 3 次の要素 前の要素 要素の値 1 次の要素 前の要素 要素の値 4 次の要素 前の要素
52.
ここまでをまとめると ●vector:「k番目の要素を取得」という操作 (ランダムアクセス)が多いときに有利
●list:要素の挿入・削除が多いときに有利
53.
さて
54.
もう一つ 別の需要を 考えてみます
55.
検索
56.
検索問題 std::vector<int> hoge
= {3, 1, 4}; hogeの中に「2」があるか調べるには?
57.
検索問題 std::vector<int> hoge
= {3, 1, 4}; hogeの中に「2」があるか調べるには? →先頭から順に見る。 hogeの要素数が増えると当然遅くなる。 →std::list<int>だったとしても同じ。
58.
vectorだろうが listだろうが 検索は
時間がかかる
59.
でも 安心してください
60.
検索時間の削減を 優先した コンテナ型もある
61.
コンテナ型(3): set ●集合(要素を重複なく格納)
●「ある要素が存在するか否か」を 比較的高速に判定可能 std::set<int> hoge = {3, 1, 4}; std::set<int>::iterator it = hoge.find(6);
62.
コンテナ型(3): set ●multiset(要素を重複ありで格納)
もある ●C++11では、unordered_set・ unordered_multiset (内部実装が異なる)もある set:二分木 unordered_set:ハッシュテーブル
63.
setの特性(1) ●ある要素が存在するか調べる →setなら
logn に比例する程度の時間。 (n: すでに入っている要素数) →unordered_setなら、nにほぼ依存しない 時間で済む上、setよりも省メモリ。 ただしC++11対応環境が必要。
64.
setの特性(2) ●検索が高速になるように、 要素は内部で勝手に並び替えられている。
●なので、順番を維持したいときは 別途対策を考える必要がある。 ●setは要素の大小順、unordered_setは ハッシュ関数(詳細略)の値の順で並ぶ
65.
ここまでをまとめると 型 計算時間
(n:格納された要素数) 任意の 順序での 要素格納 ランダム アクセス 要素の 挿入・削除 要素の検索 vector 速い O(1)時間 遅い O(n)時間 遅い O(n)時間 可能 list forward_list 遅い O(n)時間 速い O(1)時間 遅い O(n)時間 可能 set unordered_set など できない (そもそも、 自由に並べ られない) 速い O(1)~O(logn) 時間 速い O(1)~O(logn) 時間 不能
66.
ここまで説明したもの vector, list,
forward_list#, set, multiset, unordered_set#, unordered_multiset# #:C++11で新規導入
67.
まだいろいろ あるので 手短に説明します
68.
コンテナ型(4): deque ●固定サイズの配列を可変個繋いでいる
●先頭か末尾であれば挿入・削除が高速 (それ以外はvectorと同じで低速) ●listよりメモリを使わないので、挿入・削除が 先頭か末尾中心であるときに有効 ●ランダムアクセスも可能 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 6 2 6 4 3 3 8
69.
コンテナ型(5): priority_queue ●入れた要素を大きさの順にしか取り出せない
●その代わり、取り出しは高速で 要素の挿入も比較的高速
70.
コンテナ型(6): array 普通の固定長配列(a[10]など)に便利な
機能を追加したもの。C++11で新規導入 コンテナ型(7): bitset 固定長のビット列。いわゆる「フラグ」 可変長の場合はvector<bool>を使うなどの 対応が必要
71.
コンテナ型(8): stack 「スタック」。割愛します
コンテナ型(9): queue 「キュー」。割愛します
72.
ここまで説明したもの vector, list,
forward_list#, set, multiset, unordered_set#, unordered_multiset#, deque, priority_queue, array#, bitset, stack, queue #:C++11で新規導入
73.
現時点での まとめ
74.
ここまで出てきた コンテナ型の 使い分け
75.
状況おすすめ 要素数が少ない vector
ランダムアクセスする機会が多い 計算時間よりもメモリ消費を抑えたいvector/deque 要素の挿入・削除を する機会が多い 先頭・末尾が中心deque 途中にもlist/forward_list 要素の検索をする 機会が多い 重複した要素の 格納は不要 set/unordered_set 重複した要素の 格納も必要 multiset/ unordered_multiset ※priority_queue, array, bitset, stack, queueは割愛
76.
ここで 一旦休憩 質問ありましたらどうぞ
77.
STLの コンテナ型一覧 (Part
2)
78.
Part 2は そんなに長く
ないです
79.
Part 2で やること
80.
連想配列
81.
連想配列 ふつうの配列と違って 好きな型の値で要素を参照できる
Rubyだと「ハッシュ」とか、Pythonだと「辞書」とか呼ばれる std::map<std::string, int> attendee = {{"Kitami", 8}, {"Sapporo", 5}}; std::cout << attendee["Sapporo"] << std::endl; std::cout << attendee["Kitami"] << std::endl; ++attendee["Kitami"]; std::cout << attendee["Sapporo"] << std::endl; std::cout << attendee["Kitami"] << std::endl;
82.
std::map<int, double> hoge;
// ↑int型の値を指定して // double型の値を設定/取得する std::map<std::string, int> piyo; // ↑string型(文字列型)の値を // 指定して // int型の値を設定/取得する
83.
さっきまでとの違い 当然だが、型を2つ指定する必要 std::vector<int>
hoge; // ↑指定する型はintだけ std::map<std::string, int> piyo; // ↑指定する型はstringとint
84.
STLの連想配列型 ●map ●unordered_map
●multimap ●unordered_multimap
85.
使い分け ●"unordered"の有無 →実装の違い(setと同様)
C++11前提でよいならunordered優先で ●"multi"の有無 →重複を許すか否か(setと同様)
86.
ここまで説明したもの vector, list,
forward_list#, set, multiset, unordered_set#, unordered_multiset#, deque, priority_queue, array#, bitset, stack, queue, map, multimap, unordered_map#, unordered_multimap# #:C++11で新規導入
87.
STLの コンテナ型は これで全部
(おそらく)
88.
では、もっと 活用してみよう
89.
STLを使うと 便利なこと
90.
再掲 // 「intのvector」「doubleのvector」を作る
std::vector<int> hoge = {3, 1, 4}; std::vector<double> piyo = {5.6, 1.2, 3.4}; // intでもdoubleでも同じ記法でソート(並べ替え)できる std::sort(hoge.begin(), hoge.end()); std::sort(piyo.begin(), piyo.end()); 型が違っても同じコードが使える
91.
それだけじゃない // 「intのvector」「intのdeque」を作る
std::vector<int> hoge = {3, 1, 4}; std::deque<int> piyo = {3, 1, 4}; // vectorでもlistでも同じ記法でソート(並べ替え)できる std::sort(hoge.begin(), hoge.end()); std::sort(piyo.begin(), piyo.end()); コンテナ型の方が違っていてもよい!
92.
STLには、このような コンテナ型を問わない APIが大量に用意されている
↓ コードの使い回しが容易 型の切り替えが容易
93.
イテレータ ●「要素の列挙」を抽象化したもの ●例えば「次の要素を得る」ことは
vectorなら「ポインタをインクリメント」 listなら「別途格納された次のポインタへ」 ●このおかげで様々な汎用性が得られている 3 1 4 7
94.
イテレータ ●「要素の列挙」を抽象化したもの ●例えば「次の要素を得る」ことは
vectorなら「ポインタをインクリメント」 listなら「別途格納された次のポインタへ」 ●このおかげで様々な汎用性が得られている 要素の値 3 次の要素 前の要素 要素の値 1 次の要素 前の要素 要素の値 4 次の要素 前の要素
95.
イテレータ 要素を単純に列挙するコード std::vector<int>
hoge = {3, 1, 4}; for(std::vector<int>::iterator it = hoge.begin(); it != hoge.end(); ++it){ // イテレータはポインタ同様、*で値に変換できる std::cout << *it << std::endl; } ※補足:hoge.end()は「最終要素の次」、 すなわち「ダミーの無効な要素」を表す
96.
イテレータ 要素を単純に列挙するコード std::list<int>
hoge = {3, 1, 4}; for(std::list<int>::iterator it = hoge.begin(); it != hoge.end(); ++it){ // イテレータはポインタ同様、*で値に変換できる std::cout << *it << std::endl; } vectorでもlistでもコードはほぼ同じ!
97.
アルゴリズム ●#include <algorithm>すると
いろんなアルゴリズムが利用可能に ●検索、並び替え、コピーなど ●パラメータとしてイテレータを渡すことが多い std::vector<int> hoge = {3, 1, 4}; // 偶数である最初の要素を返す std::vector<int>::iterator search_result = std::find_if(hoge.begin(), hoge.end(), [](int x){ return x % 2 == 0; });
98.
おわりに
99.
STLの便利なところ ●基本的なデータ構造なら 自分でわざわざ作らなくてよい
●アルゴリズムも然り ●標準ライブラリなので環境依存も小さい ●新しめのコンパイラ(C++11対応)を 使うとさらに便利に
100.
STLの注意点 ●データ構造の選択はプログラマーの判断 ●今回割愛した話
●イテレータを1つ進めるのが速い型、遅い型 (※unorderedでないset、mapは遅い) ●イテレータを外部に保存してよい型、 保存に注意を要する型 (※注意を要する型 =vector、deque、unordered_*)
101.
Ohotech 特盛 #10(2014.8.30)
C++のSTLの コンテナ型を概観する 終わり
Download