SlideShare ist ein Scribd-Unternehmen logo
1 von 23
C++によるソート入門


       Aiming 大阪スタジオ
                後藤 文典
前篇
関数インターフェースの移り変わり
Cのインターフェース(1/2)
void qsort( void *ptr, size_t count, size_t size,
        int(*comp)( const void *, const void * ));


 • 一応あらゆる型に対応できるけど・・・
 • ×:型情報がない
 • ×:安全じゃない
   – 使う側が安全に呼んでくれるはず・・・
 • ×:引数多い
Cのインターフェース(2/2)
void myqsort( void *ptr, size_t count, size_t size,
       int(*comp)( const void *, const void * ))
{ char *p = (char *)ptr;
   for(int i=0; i < n–1; i++) for(int j = n–1; j > i; j-- ){
       char *rhs = p + (j * size);
       char *lhs = p + ((j-1) * size);
       if (comp(rhs, lhs) < 0) swap(rhs, lhs, size);
   } }
   myqsort(array, 10, sizeof(int), comp_int_less);
   myqsort(array, 10, sizeof(int), comp_int_greater);
C++のインターフェース(1/2)
          ~ templateベース ~
template < class It >
void sort( It begin, It end );

template< class It, class Cmp >
void sort(It begin, It end, Cmp cmp);
※It:Iterator
※Cmp:Compare


 • ○:静的に型情報解決
   – コンパイル成功 ≒ ちゃんと動く
C++のインターフェース(2/2)
           ~ templateベース ~
template < class It >
void mysort(It begin, It end)
{ mysort(begin, end, myless<typename It::value_type>()); }

template< class It, class Cmp >
void mysort(It begin, It end, Cmp cmp) {
  It n_1 = end; n_1--; // 最後を指す
  for(It i=begin; i != n_1; ++i) for(It j=n_1; j != i; --j) {
     It j_1 = j; j_1--;
     if (cmp(*j, *j_1)) swap(*j, *j_1);
  }}
mysort(vec.begin(), vec.end());
mysort(vec.begin(), vec.end(), mygreater<int>());
C++ & boostのインターフェース(1/2)
    ~ range-based algorithms ~
template< class Range >
Range &sort(Range &range);

template< class Range, class Cmp >
Range &sort(Range &range, Cmp cmp);

• Boost.Rangeが代表
   – STLの薄いラッパー
• ○:引数がよりシンプルに
• ○:可変長配列(vector等)と固定長配列の違いを
      意識する必要がほとんど無い
   – 中で違いを吸収している
C++ & boostのインターフェース(2/2)
    ~ range-based algorithms ~
template< class Range >
Range &mysort(Range &range) {
  std::sort(std::begin(range), std::end(range));
  return range;
}
template< class Range, class Cmp >
Range &mysort(Range &range, Cmp cmp) {
  std::sort(std::begin(range, std::end(range), cmp);
  return range;
}

mysort(vec)
mysort(vec, mygreater<int>());
C++11のインターフェース(1/2)
~ rvalue reference & move semantics ~
template< class Range >
Range sort(Range range);
template< class Range, class Cmp >
Range sort(Range range, Cmp cmp);
• ○:データの流れが使う側で分かる
• ×:C++11未対応のコンパイラにソースを移植すると
    コピーコンストラクタだらけになってしまう

   ※rvalue referenceとmove semanticsについては後述
C++11のインターフェース(2/2)
~ rvalue reference & move semantics ~
template< class Range >
Range mysort(Range range) {
  std::sort(std::begin(range), std::end(range));
  return range;
}

template< class Range, class Cmp >
Range mysort(Range range, Cmp cmp) {
  std::sort(std::begin(range), std::end(range), cmp);
  return range;
}
vec = mysort(std::move(vec));
vec = mysort(std::move(vec), mygreater<int>());
余談
     良く分かる(かもしれない)
rvalue reference & move semantics
rvalue reference & move semantics(1/4)

• rvalue reference(右辺値参照)
   – = の右っかわ
      • int型の値・クラスの一時オブジェクト
• move semantics
   – rvalueを移動する
   – ○:コピーのコストが発生しない
rvalue reference & move semantics(2/4)
// move semanticsに対応したクラス
class Buffer {
  char *m_ptr; size_t m_size;
public:
  Buffer(size_t size): m_size(size)
  { m_ptr = new char[size]; }
  Buffer(const Test &r): m_size(r.m_size) {
  { m_ptr = new char[r.m_size];
    std::copy(r.m_ptr, r.m_ptr + r.m_size, m_ptr); }
  // ↓ムーブコンストラクタ
  Buffer(Test && r): m_ptr(r.m_ptr), m_size(r.m_size)
  { r.m_ptr = nullptr; }
  ~ Buffer() { delete[] m_ptr; }
}
rvalue reference & move semantics(3/4)
class Buffer {
public:
  Buffer(size_t size);
  Buffer(const Test &r);
  Buffer(Test && r);
  ~ Buffer();
}

Buffer buffer(1024);
Buffer movedBuffer(std::move(buffer));//bufferは使えなくなる
rvalue reference & move semantics(4/4)

std::vector<int> makeTable(size_t size) {
  std::vector<int> vec(size);
  // 関数内の変数が戻り値になった場合は原則moveされる
  // ※C++11対応コンパイラの必要あり、
  // 未対応だとコピーされる
  return vec;
}

std::vector<int> vec = makeTable(1024);
前編の参考資料
• Boost.Range入門
   – http://www.slideshare.net/egtra/boostrange
• rvalue reference完全入門
   – http://cpplover.blogspot.jp/2009/11/rvalue-
     reference_23.html
• 暗黙のmoveとNRVO
   – http://d.hatena.ne.jp/joynote/20110822/1314012953
後編
ソートのアルゴリズム
ソート
• データの集合を一定の規則に従って並べること
• 大抵値の昇順か降順
ソートで使われる用語
• ソートの結果
 – 安定ソート
    • 同じ値に関して、ソート前の順序が維持されている
 – 安定でないソート
    • 同じ値に関して、ソート前の順序が維持される保証が無い
• ソートのコスト
 – 平均計算時間
    • 最悪 ~ 最良の計算時間の平均
 – 最悪計算時間
    • そのソートが最も苦手とするデータ並び時のソート時間
 – メモリ使用量
    • ソート時に使用されるメモリ量
色々なソートアルゴリズム(1/2)
• クイックソート
 – ○:平均計算時間はソートアルゴリズムの中でも速い方
 – ×:最悪計算時間がO(n~2)とかなり遅い
• ヒープソート
 – ○:メモリ効率が良い
 – ×:並列化出来ない
• イントロソート
 – クイックソートとヒープソートの混成
 – 最初はクイックソート、途中からヒープソートに切り替え
 – ○:クイックソートの最悪計算時間を克服
色々なソートアルゴリズム(2/2)
• マージソート
  – ○:安定ソート、並列化しやすい
  – ×:メモリ食い
  – 速度はそこそこ
• In-placeマージソート
  –   マージソートとクイックソートの混成
  –   基本はマージソートで、途中でクイックソート的な事をする
  –   ○:メモリ効率が良い
  –   Web巡回する限り速くないけど遅くも無いという印象
• 挿入ソート
  – ○:アルゴリズム単純、整列済み配列への挿入が高速
  – 単体で使う事はあまりない、他のソートの部品として使う
• Etc
ソートの選び方
• 例えば
 – とあるスプライト群をZソートしたい
    • クイックソートを選択
       – ×:プレイ中にいきなり重くなる?!
       – 最悪計算時間はO(n~2)なので、
         データが最悪計算時間がかかる並びになってしまった
 – マルチスレッドで並列化したい
    • ×:ただ闇雲にスレッドセーフにしただけでは、
         lock, unlockのオーバーヘッドでかえって遅くなる
    • データをスレッド数で分割し、それぞれを
      イントロソートやマージソートでソート後、
      最後にマージソートや挿入ソートをする等の工夫をする

• 状況や扱うデータ、使えるメモリ等によって使い分ける
後編の参考資料
• Wikipedia ソート
  – http://ja.wikipedia.org/wiki/ソート
• 要素数が少ない場合のソートベンチマーク
  – http://www.moon.sannet.ne.jp/okahisa/sort/node38.html
• ソートアルゴリズムについて考える
  – http://d.hatena.ne.jp/junjun777/20120821

Weitere ähnliche Inhalte

Was ist angesagt?

LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5
noname409
 

Was ist angesagt? (20)

Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本Scalaの限定継続の応用と基本
Scalaの限定継続の応用と基本
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5ディジタル信号処理 課題解説 その5
ディジタル信号処理 課題解説 その5
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
CG2013 03
CG2013 03CG2013 03
CG2013 03
 
CG2013 05
CG2013 05CG2013 05
CG2013 05
 
Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 
フラグを愛でる
フラグを愛でるフラグを愛でる
フラグを愛でる
 
OpenGLと行列
OpenGLと行列OpenGLと行列
OpenGLと行列
 
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)
 
R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
CG2013 02
CG2013 02CG2013 02
CG2013 02
 

Andere mochten auch (6)

C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
海外ゲーム技術勉強会#1 OGRE3D
海外ゲーム技術勉強会#1 OGRE3D海外ゲーム技術勉強会#1 OGRE3D
海外ゲーム技術勉強会#1 OGRE3D
 
C++11とゲーム製作
C++11とゲーム製作C++11とゲーム製作
C++11とゲーム製作
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
3D勉強会 第1回 3Dプログラミングのススメ
3D勉強会 第1回 3Dプログラミングのススメ3D勉強会 第1回 3Dプログラミングのススメ
3D勉強会 第1回 3Dプログラミングのススメ
 
3D描画基礎知識
3D描画基礎知識3D描画基礎知識
3D描画基礎知識
 

Ähnlich wie C++によるソート入門

2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
Hiro H.
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
Shintaro Fukushima
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
Shota Baba
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
Jiro Nishiguchi
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
Tomonobu_Hirano
 

Ähnlich wie C++によるソート入門 (20)

中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
 
R言語勉強会#4.pdf
R言語勉強会#4.pdfR言語勉強会#4.pdf
R言語勉強会#4.pdf
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
 
勉強会課題①
勉強会課題①勉強会課題①
勉強会課題①
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
講座Java入門
講座Java入門講座Java入門
講座Java入門
 

Mehr von AimingStudy

ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
AimingStudy
 
Node.jsではじめるサーバ構築
Node.jsではじめるサーバ構築Node.jsではじめるサーバ構築
Node.jsではじめるサーバ構築
AimingStudy
 
AWSではじめるお手軽オンラインゲーム開発
AWSではじめるお手軽オンラインゲーム開発AWSではじめるお手軽オンラインゲーム開発
AWSではじめるお手軽オンラインゲーム開発
AimingStudy
 
SVN経験者のためのGIT入門
SVN経験者のためのGIT入門SVN経験者のためのGIT入門
SVN経験者のためのGIT入門
AimingStudy
 
Flashをcocos2dxで再生
Flashをcocos2dxで再生Flashをcocos2dxで再生
Flashをcocos2dxで再生
AimingStudy
 
1日で始めるglsl
1日で始めるglsl1日で始めるglsl
1日で始めるglsl
AimingStudy
 
Adobe scoutの紹介
Adobe scoutの紹介Adobe scoutの紹介
Adobe scoutの紹介
AimingStudy
 

Mehr von AimingStudy (11)

Kick Off Technical Artist & ShaderFx - テクニカルアーティストと ShaderFXのお話
Kick Off Technical Artist & ShaderFx - テクニカルアーティストと ShaderFXのお話Kick Off Technical Artist & ShaderFx - テクニカルアーティストと ShaderFXのお話
Kick Off Technical Artist & ShaderFx - テクニカルアーティストと ShaderFXのお話
 
デザイナーがMELスクリプトを書いて工数削減した話
デザイナーがMELスクリプトを書いて工数削減した話デザイナーがMELスクリプトを書いて工数削減した話
デザイナーがMELスクリプトを書いて工数削減した話
 
剣と魔法のログレス(PC版)の自慢と課題
剣と魔法のログレス(PC版)の自慢と課題剣と魔法のログレス(PC版)の自慢と課題
剣と魔法のログレス(PC版)の自慢と課題
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
 
Unityと.NET
Unityと.NETUnityと.NET
Unityと.NET
 
Node.jsではじめるサーバ構築
Node.jsではじめるサーバ構築Node.jsではじめるサーバ構築
Node.jsではじめるサーバ構築
 
AWSではじめるお手軽オンラインゲーム開発
AWSではじめるお手軽オンラインゲーム開発AWSではじめるお手軽オンラインゲーム開発
AWSではじめるお手軽オンラインゲーム開発
 
SVN経験者のためのGIT入門
SVN経験者のためのGIT入門SVN経験者のためのGIT入門
SVN経験者のためのGIT入門
 
Flashをcocos2dxで再生
Flashをcocos2dxで再生Flashをcocos2dxで再生
Flashをcocos2dxで再生
 
1日で始めるglsl
1日で始めるglsl1日で始めるglsl
1日で始めるglsl
 
Adobe scoutの紹介
Adobe scoutの紹介Adobe scoutの紹介
Adobe scoutの紹介
 

C++によるソート入門

  • 1. C++によるソート入門 Aiming 大阪スタジオ 後藤 文典
  • 3. Cのインターフェース(1/2) void qsort( void *ptr, size_t count, size_t size, int(*comp)( const void *, const void * )); • 一応あらゆる型に対応できるけど・・・ • ×:型情報がない • ×:安全じゃない – 使う側が安全に呼んでくれるはず・・・ • ×:引数多い
  • 4. Cのインターフェース(2/2) void myqsort( void *ptr, size_t count, size_t size, int(*comp)( const void *, const void * )) { char *p = (char *)ptr; for(int i=0; i < n–1; i++) for(int j = n–1; j > i; j-- ){ char *rhs = p + (j * size); char *lhs = p + ((j-1) * size); if (comp(rhs, lhs) < 0) swap(rhs, lhs, size); } } myqsort(array, 10, sizeof(int), comp_int_less); myqsort(array, 10, sizeof(int), comp_int_greater);
  • 5. C++のインターフェース(1/2) ~ templateベース ~ template < class It > void sort( It begin, It end ); template< class It, class Cmp > void sort(It begin, It end, Cmp cmp); ※It:Iterator ※Cmp:Compare • ○:静的に型情報解決 – コンパイル成功 ≒ ちゃんと動く
  • 6. C++のインターフェース(2/2) ~ templateベース ~ template < class It > void mysort(It begin, It end) { mysort(begin, end, myless<typename It::value_type>()); } template< class It, class Cmp > void mysort(It begin, It end, Cmp cmp) { It n_1 = end; n_1--; // 最後を指す for(It i=begin; i != n_1; ++i) for(It j=n_1; j != i; --j) { It j_1 = j; j_1--; if (cmp(*j, *j_1)) swap(*j, *j_1); }} mysort(vec.begin(), vec.end()); mysort(vec.begin(), vec.end(), mygreater<int>());
  • 7. C++ & boostのインターフェース(1/2) ~ range-based algorithms ~ template< class Range > Range &sort(Range &range); template< class Range, class Cmp > Range &sort(Range &range, Cmp cmp); • Boost.Rangeが代表 – STLの薄いラッパー • ○:引数がよりシンプルに • ○:可変長配列(vector等)と固定長配列の違いを 意識する必要がほとんど無い – 中で違いを吸収している
  • 8. C++ & boostのインターフェース(2/2) ~ range-based algorithms ~ template< class Range > Range &mysort(Range &range) { std::sort(std::begin(range), std::end(range)); return range; } template< class Range, class Cmp > Range &mysort(Range &range, Cmp cmp) { std::sort(std::begin(range, std::end(range), cmp); return range; } mysort(vec) mysort(vec, mygreater<int>());
  • 9. C++11のインターフェース(1/2) ~ rvalue reference & move semantics ~ template< class Range > Range sort(Range range); template< class Range, class Cmp > Range sort(Range range, Cmp cmp); • ○:データの流れが使う側で分かる • ×:C++11未対応のコンパイラにソースを移植すると コピーコンストラクタだらけになってしまう ※rvalue referenceとmove semanticsについては後述
  • 10. C++11のインターフェース(2/2) ~ rvalue reference & move semantics ~ template< class Range > Range mysort(Range range) { std::sort(std::begin(range), std::end(range)); return range; } template< class Range, class Cmp > Range mysort(Range range, Cmp cmp) { std::sort(std::begin(range), std::end(range), cmp); return range; } vec = mysort(std::move(vec)); vec = mysort(std::move(vec), mygreater<int>());
  • 11. 余談 良く分かる(かもしれない) rvalue reference & move semantics
  • 12. rvalue reference & move semantics(1/4) • rvalue reference(右辺値参照) – = の右っかわ • int型の値・クラスの一時オブジェクト • move semantics – rvalueを移動する – ○:コピーのコストが発生しない
  • 13. rvalue reference & move semantics(2/4) // move semanticsに対応したクラス class Buffer { char *m_ptr; size_t m_size; public: Buffer(size_t size): m_size(size) { m_ptr = new char[size]; } Buffer(const Test &r): m_size(r.m_size) { { m_ptr = new char[r.m_size]; std::copy(r.m_ptr, r.m_ptr + r.m_size, m_ptr); } // ↓ムーブコンストラクタ Buffer(Test && r): m_ptr(r.m_ptr), m_size(r.m_size) { r.m_ptr = nullptr; } ~ Buffer() { delete[] m_ptr; } }
  • 14. rvalue reference & move semantics(3/4) class Buffer { public: Buffer(size_t size); Buffer(const Test &r); Buffer(Test && r); ~ Buffer(); } Buffer buffer(1024); Buffer movedBuffer(std::move(buffer));//bufferは使えなくなる
  • 15. rvalue reference & move semantics(4/4) std::vector<int> makeTable(size_t size) { std::vector<int> vec(size); // 関数内の変数が戻り値になった場合は原則moveされる // ※C++11対応コンパイラの必要あり、 // 未対応だとコピーされる return vec; } std::vector<int> vec = makeTable(1024);
  • 16. 前編の参考資料 • Boost.Range入門 – http://www.slideshare.net/egtra/boostrange • rvalue reference完全入門 – http://cpplover.blogspot.jp/2009/11/rvalue- reference_23.html • 暗黙のmoveとNRVO – http://d.hatena.ne.jp/joynote/20110822/1314012953
  • 19. ソートで使われる用語 • ソートの結果 – 安定ソート • 同じ値に関して、ソート前の順序が維持されている – 安定でないソート • 同じ値に関して、ソート前の順序が維持される保証が無い • ソートのコスト – 平均計算時間 • 最悪 ~ 最良の計算時間の平均 – 最悪計算時間 • そのソートが最も苦手とするデータ並び時のソート時間 – メモリ使用量 • ソート時に使用されるメモリ量
  • 20. 色々なソートアルゴリズム(1/2) • クイックソート – ○:平均計算時間はソートアルゴリズムの中でも速い方 – ×:最悪計算時間がO(n~2)とかなり遅い • ヒープソート – ○:メモリ効率が良い – ×:並列化出来ない • イントロソート – クイックソートとヒープソートの混成 – 最初はクイックソート、途中からヒープソートに切り替え – ○:クイックソートの最悪計算時間を克服
  • 21. 色々なソートアルゴリズム(2/2) • マージソート – ○:安定ソート、並列化しやすい – ×:メモリ食い – 速度はそこそこ • In-placeマージソート – マージソートとクイックソートの混成 – 基本はマージソートで、途中でクイックソート的な事をする – ○:メモリ効率が良い – Web巡回する限り速くないけど遅くも無いという印象 • 挿入ソート – ○:アルゴリズム単純、整列済み配列への挿入が高速 – 単体で使う事はあまりない、他のソートの部品として使う • Etc
  • 22. ソートの選び方 • 例えば – とあるスプライト群をZソートしたい • クイックソートを選択 – ×:プレイ中にいきなり重くなる?! – 最悪計算時間はO(n~2)なので、 データが最悪計算時間がかかる並びになってしまった – マルチスレッドで並列化したい • ×:ただ闇雲にスレッドセーフにしただけでは、 lock, unlockのオーバーヘッドでかえって遅くなる • データをスレッド数で分割し、それぞれを イントロソートやマージソートでソート後、 最後にマージソートや挿入ソートをする等の工夫をする • 状況や扱うデータ、使えるメモリ等によって使い分ける
  • 23. 後編の参考資料 • Wikipedia ソート – http://ja.wikipedia.org/wiki/ソート • 要素数が少ない場合のソートベンチマーク – http://www.moon.sannet.ne.jp/okahisa/sort/node38.html • ソートアルゴリズムについて考える – http://d.hatena.ne.jp/junjun777/20120821