C++

wavelet tree

圧縮検索で使われる技術wavelet treeをテンプレートライブラリとして書いてみました。 →を参考にしてみました。高速かつ省メモリで文字列を扱うデータ構造「wavelet tree」 元となる記事が大変興味深かったのだけど、どうもサンプルコードが複雑すぎるのと、…

正しい 演算子"<<" の定義の仕方

C++で何らかの型を定義して、その型を文字列に変換したいとき、演算子" class Hoge{ public: //たとえば配列のような型だったとする size_t size()const{/*略*/} int operator[](size_t i)const{/*略*/} /*略*/ }; Hoge hoge; std::cout << hoge << std::end…

ひとつはふくすうの部分集合

デザインパターンってあるけれど、これは設計というより、内部の関数、構造体どうしのインターフェースのノウハウ・・・パターンだと考えられるんじゃないかと思う。 プログラムは大きく3つの要素・・・構造・アルゴリズム・インターフェースによって構築さ…

MemoryPoolについて

MemoryPoolという構造体がある。これは一種のアロケータで、あるサイズ分メモリーをブロックとして確保しておき、それをためて置く。これを必要になったときそれを使用する。Effecient C++にはそんな構造体が載っている。 いくつかの不具合を修正したので、…

クラスを使おう!無名名前空間を利用しよう!

オブジェクト指向言語であるC++においてクラスは基礎的な部品であり、論理構造を抽象化し、ソースコードの見通しを良くしてくれる。 クラスは他の関数ないしクラスのメンバ関数において、実装として局所的に使われるケースがあっても良い。なにもクラスは「…

compositeパターン

compositeパターンは複数のものを単数扱いして複雑な構造への処理を容易に行なえるようにするものだ。この適用範囲は思いのほか広い。これには、『複数のものを単数扱い』というより『単数の出力を複数の出力』とみなすとした方が分かりやすいかもしれない。

例外安全にする基本

例外に対し安全なコードを書く基本 ClassA * p_ClassA = new ClassA(); 【何か】 delete p_ClassA;としてはいけない。

関数の中のstatic変数

static変数は怖い。摩訶不思議。 const char* func(){ static std::string s; s = GetHoge(); return s.c_str(); }を const char* func(){ static std::string s = GetHoge(); return s.c_str(); }にすると期待どうりに動かないだろう。2/24 返り値の型まち…

pimplイディオム

実装をヘッダファイルに書かないためにそのすべてのメンバを実装したクラスへのポインタのみをメンバにもつことをpimpl*1イディオムと呼ぶ。2/24 パターン→イディオム *1:Pointer of IMPLement

ロガーの作り方

ロガーとはログを書き出す仕組みのこと。 C++を使っているのであれば、多態を使って柔軟なロガーを作ることができる。

三角形の交差判定

3Dプログラミングにおいて三角形(ポリゴン)の交差判定は重要である。このルーチンの品質・速度は全体のパフォーマンスに大きく影響する。 三角形の交差判定でよく使われるのが以下の手法だと思う。 よく教科書に載っている手法(平面に交差→三角形の内部判…

値返ししよう。

小さな算術クラスは値返ししようというお話。 以前(といっても1年半以上前だが)僕はconst参照を使ってET(Expression Template)を実装しようと試みたことがある。 const参照ならコピーのコストが無いので、これがさらに最適化すればETが実装できるはずだと…

copy_n

copy_n()という関数は標準にはない*1。fill_nはあるのに。なんでないのか?その理由は良くわかってない。 copy_nの存在価値はあるか?あるとしたら最適化の考慮のためだろう。 copy_nは条件次第で最適化により高速な関数memmoveまたはmemcpyに置き換える。 …