C++

数独solverの最小コードに挑戦

数独solverは昔作ったことがあるのでsolver作成という点では再挑戦ということになる。しかし今回少し趣を変えてコード量を減らすことに重点を置いた。なので速度と可読性はとりあえず度外視した。とはいえ、有用な時間に解けなければ意味がないのである程度…

浮動小数比較の落とし穴

業務でリファクタリングを実施していた。演算結果が変わらないように毎回比較して違っていればエラーを吐くようにして、改良を進めていた。 if( std::abs( result - test ) > std::numeric_limits< double >::epsilon() ){ std::cout << "error : " << resul…

テンプレート引数に自身を継承したクラスのみ受け付ける方法

昨日のトピックの例のように、継承して自身を基底クラスのテンプレートに渡すというタイプのライブラリはしばしば見かけます。 //あるライブラリにおいて・・・ template< class T > class Library; //継承してから自分自身をテンプレート引数に渡す class M…

template method patternをインライン展開させてみる

template method patternとは、wikipediaによると「ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、そのアルゴリズムの具体的な設計をサブクラスに任せること」である。 具体例として、画像処理のシードフィルアルゴリズムでの例を昔トピックと…

ベルヌーイ数をテンプレートメタプログラミングで頑張ってみた。

ベルヌーイ数の説明は大変なので省きます。wikipediaとかに詳しく書いてあるのでそちらを参照してください。とりあえず、計算する際には以下の漸化式が便利だそうです。 ここで縦の括弧はコンビネーションです。 今回はこれをそのまま使おうと思います。まず…

C++11時代のWaitForMultipleObjects

スレッド周りのコードをwindowsAPIからC++11ライブラリの置き換えを随時やっていますが一番苦労したのがこれでした。 単に全部のスレッドが終わるのを待つだけなら全部のjoin呼べばいいだけなので簡単なのだが、タイムアウトがある場合が非常に厄介でした。…

.net経由で生ポインタを渡す

そもそもそんな必要があるのかと思われるかもしれないが事実ありえたんですよ! あるアプリ(C#)から二つのクラスライブラリ(両方ともC++/CLI)を参照しており、ライブラリ同士の依存関係はなし。なのでライブラリ同士でデータを受け渡す場合は.netの型…

独自のメモリ管理はアロケータ自作が便利

AVXを少しずつ触り始めたのだが、面倒だと感じていることの一つにアラインメントをそろえなければいけないこと。いや、必ずしも必要ないが揃っていないとloadやstoreが別命令になるので重くなるのは自明なので最初からそろえた方がいいに決まっている(そもそ…

AVXを触ってみた

はるか昔、SIMDでライブラリを書きまくっていたころがあった。当時はまだ組み込み関数もなく(いやあったかも知れないけど)インラインアセンブラでゴリゴリ書いていた。やがて環境が32bitから64bitに移行して、苦労して書いたアセンブラがすべて動かなくなっ…

基底クラスのコンストラクタで仮想関数を呼んでみた

謎のリンクエラーで1日潰れたorz class A { public: A(){ Test(); } protected: virtual void Test() = 0; }; class B:public A { public: B():A(){} protected: virtual void Test(){ std::cout << "B" << std::endl; } }; int main() { B b; } このソース…

継承元の右辺値参照

現在、古いソースコードの整理をしている。右辺値参照が出来たことに伴い、昔作ったデータ系のクラスにムーブコンストラクタを実装している。そこではまってしまった。普通のクラスなら別に問題ないのだが、継承しているクラスだととうも思うように動いてく…

メンバ関数ポインタのラッピング

めったに使わないのですぐ忘れるのでメモ #include <functional> class Cls { public: void funct(); }; Cls cls; std::mem_fun( &Cls::funct )( &cls ); std::mem_fun_ref( &Cls::funct )( cls ); std::bind( &Cls::funct, &cls )(); なお、mem_fun、mem_fun_refは引数</functional>…

GDI+を用いたjpeg保存その2

先日のトピックの続きです。 id:n-trino:20130913#p1 ピクセル一個ずつ転送というのは効率悪いから一気に転送出来ないかな?ロックして先頭ポインタ持ってこれないかなと思ってたらやっぱり出来ました。メソッド名もそのまんまでした(^^; //ビットマップ…

GDI+を用いたjpeg保存

C#とかならすごく簡単なのだがC++の場合はwindowsAPIには存在しないのでGDI+を使うのが普通みたいだ。調べたらいろいろ引っかかったのだがメモリ上のRGBからの保存方法が見つからなかったので頑張って書いてみました。 方法としては、GDI+にあるBitmapクラス…

constスマートポインタ

constなポインタは初心者がよく戸惑う文法だが、私は最近スマートポインタで戸惑ったorz 以下、対応表 const int* pRaw; std::shared_ptr< const int > pSmart; //↑ポインタの中身がconst。ポインタ自体は書き換えられる。 int* const pRaw; const std::shar…

コンテナとスマートポインタ

昔はよく以下のようなコードを書いていた。 std::vector< boost::shared_ptr< MyInterface > > task; task.push_back( boost::shared_ptr< MyInterface >( new Task1 ) ); task.push_back( boost::shared_ptr< MyInterface >( new Task2 ) ); task.push_back…

アルゴ屋さんには文字列は無縁です

まあ自然言語処理とかやっている人は凄いんだろうけど。とりあえず、大量にファイルを吐く必要があったので適当にファイル名にインデックスつけて吐いてみた。ファイル名の生成にostringstreamを使った。あとは0で埋める為にマニピュレータを利用した。 for…

確率に応じてboolを返す。その2

探したら普通にありましたorz std::bernoulli_distributionというクラスです。使い方は以下の通り。確率0.2でtrueを返します。 std::mt19937 random; std::bernoulli_distribution bd( 0.2 ); for( int i = 0; i < 100000; ++i ){ if( bd( random ) ){ count…

確率に応じてboolを返す

引数として確率を渡したらその確率でtrueが返るような関数です。モンテカルロ計算したい場合とか必要になる機能です。 まあ理論も実装も特に難しくなく、0〜1の半開区間な分布をデデキント切断すればいいだけです(謎) template< class PRECISION > class Pr…

VC2010版mersenne_twisterで叱られた

VC2010よりC++11の機能が一部搭載された。randomもその一つ。積極的に使っているのだがデバッグ中に叱られてしまった。叱られた理由は種がよくないという警告。何も考えずにとりあえず0を入れていたのだがそれが良くないっぽい。実際にソースを追ってみたら…

数独をプログラムで解いてみる。

とりあえず、一番単純な方法で、各マスに関して1〜9のうち一つだけしか入れない数値を入れていく方法。 template< int SIZE_ = 3 > class Sudoku2DSolver { public: enum{ SIZE = SIZE_, SIZE_2 = SIZE * SIZE, }; Sudoku2DSolver(); virtual ~Sudoku2DSol…

組み合わせ爆発を再現してみた

最近話題になっている動画を見てみた。 http://www.youtube.com/watch?v=Q4gTV4r0zRs ちょっと再現出来ないか嫁と娘が風呂に入っているときにぱぱっとプログラムを書いてみた。 class CombinationExplosion { public: CombinationExplosion( int size ):m_si…

トーナメント作成

はるか昔にバランスのいいトーナメントの書き方というトピックを書いた記憶があるが、それをプログラムに起こしてみた。 方針は、決勝から順番に等分に分けていくというだけです。ただし奇数の場合、どちらを多くするかという自由度があるので、内側に多くな…

素数のときだけ"JOJO!"って出力するプログラムを作ってみた

某所で話題(?)になっていたので参加してみた。 http://sue445.hatenablog.com/entry/2012/08/11/164950とりあえず何も考えずに5分程で作ったバージョン int main() { std::vector< int > primes; for( int num = 2; num < 100; ++num ){ bool bPrime(true);…

行列式をテンプレートメタプログラミングで頑張る

「行列式って何?」という人は線形代数の教科書でも読んでください(ぉ まあ最近は教科書を買わなくても教科書レベルは大抵webにあるので調べれば簡単に出てきます。行列式を解く場合は大抵はLU分解して対角要素を掛け算して出すと思います。しかし今回は以…

C++11時代の多重ループbreak

以前、多重ループを抜ける方法を列挙したことがあったけど、もう一つ例を思いついたので挙げてみる。 個人的には関数にしてreturnが好みなのだが、これの欠点としてループを抜けるためだけの小さな関数が出来、また呼ばれる場所から離れてしまって可読性に影…

variadic-templateによるタプル

前回、関数を実装したので今回はクラスを実装してみるテスト。 作り方は関数同様に再帰的に作るっぽいのでその通りやってみました。 template< class... D > class Tuple; template<> class Tuple<>{}; template< class D, class... DS > class Tuple< D, DS…

初めての可変長テンプレート(variadic-templates)

早速gccで遊び始めました。文法に慣れるために適当なお題を決めて練習しました。 お題はstd::swapの拡張で変数を1つずつずらすというもの。右回転と左回転があるので両方作りました。 左回転は割りと簡単でした。 #include <iostream> template< class TYPE > void shi</iostream>…

3次元ヒルベルト曲線

前回の記事からちょくちょく頑張っていて一応「長さ→座標」部分は出来ました。同じ対応で「座標→長さ」も出来るかと思いきやどうもダメっぽいのでとりあえず諦めました(ぉ class HilbertCurve3 { public: HilbertCurve3( int order ):m_order(order){} virt…

2次元ヒルベルト曲線

なんとなく作ってみました。と言っても、wikipediaの英語版のサンプルをほぼコピペです。なので詳細はそちらを見てください(ぉ class HilbertCurve2 { public: HilbertCurve2( int order ):m_order(order){} virtual ~HilbertCurve2(){} int GetAllCount()co…