C/C++

facadeパターン

boost.iterator_facadeのコードを真似て、lattice_systemを実装してみた。 かなりトリッキーなコードだけど、結構使えそうなパターンだな。 下手なデザインパターンの教科書を読むより、コードを読んだ方がいろんなパターンが勉強できて面白い。 #include <iostream> #</iostream>…

名無しテンプレート引数 + friend

テンプレート引数が違うのみのクラスをfriend指定したい場合は template <class A, class B, class C> class foo { template <class,class,class> friend class foo; // .... };と書けるみたい。テンプレートどっぷりなコードには必要不可欠だな、これ。名無しテンプレート引数といえば template <class A, template <class> class B> </class></class,class,class></class>…

Exceptional C++

Exceptional C++―47のクイズ形式によるプログラム問題と解法 (C++ in‐Depth Series)作者: ハーブサッター,浜田光之,Harb Sutter,浜田真理出版社/メーカー: ピアソンエデュケーション発売日: 2000/11メディア: 単行本購入: 9人 クリック: 134回この商品を含む…

交差点問題

大学のアルゴリズムとデータ構造という授業で題材になってた問題。それにBGL(Boost Graph Library)で取り組んでみた。 交差点問題 左図の様な交差点がある。 全ての進路に信号が設置してある。 矢印方向にしか進むことができない。 交差する進路は同時に信号…

多倍長整数演算:繰り下がり

とりあえずレポートできたしもうこのネタは終わりにしよう。早く自分の開発に戻らねば。このところバイトと大学に追われてしまっている..orz RubyのBignumを読んでてなるほどと思ったこと。(たぶん他のどの実装も同じはず) 多倍長整数の減算をする場合は繰り…

多倍長整数演算:基数変換(続)

大体Knuthの内容が理解できた。本を返さなきゃならないのでメモっておこう。 とりあえず分かり易いように二進数十進数の変換に限定して書いとく.(他の基数でもほとんど同じ) まず進数に変換 普通の基数変換では、多倍長整数uがあった場合これを次々と10で割…

多倍長整数演算:基数変換

RubyのBignum実装を参考に実装してみた。Rubyってソースが綺麗な事で有名だけどBignumのソースは正直...うーむ読みにくい。 まぁ、速度が重要な数値回りのライブラリだし一つの変数を使いまわしたりするのは仕方ないのかもしれない。 整数環なので加算・減算…

追記:多倍長整数演算

多倍長演算の場合キャリーを考える必要があって、一桁mビットだと乗算のキャリーが最大mビットだから、普通はunsigned short型(2バイト)配列で整数値を表し計算途中はunsigned int(4バイト)型配列を使えば良い。 んで、もし基数を負数にするとしたら一桁mビ…

多倍長整数演算

レポートの2つ目の課題。 多倍長演算は結局ただの筆算なので実装は楽だろう。 でも、それじゃ自分の勉強にならないのでネタを探していた。*1 多倍長演算の実装には ビット列を符号なし整数として保持。符号情報を別に扱う。 ビット列に符号情報まで埋め込む…

アルゴリズムとデータ構造レポート

初レポート。内容は C言語でリスト構造を作れ C言語で整数環を作れ というもの。 リスト リストは以前作った事があるので、よく分かる。双方向リンクリストを実装した。 でも、来週からはSchemeを授業でやるらしいけど、LISPのリスト構造にしてみた方が良い…

根拠のないインターフェースの実装はやめよう。

More Effective C++―最新35のプログラミング技法 (ASCII Addison Wesley Programming Series)を読んでてふと、自分のソースを見たらめちゃめちゃ汚いと思った...orz 例えば使う予定も無いのにlattice_systemなどに operator= swap デフォルトコンストラクタ …

戻り値最適化

More Effective C++を入手した。まだ4章までしか読んでないけどやっぱこの手の本は勉強になるな〜。とりあえず、今日覚えたこと。 戻り値最適化を促進する為には無名一時オブジェクトを返せ。 例えば次のコードでは point a = b + c; operator+(b, c)を実行…

格子系クラス

セルオートマトンでは正方格子以外に三角格子や六角格子なども利用したりするし、立方格子やそのたの格子系(例えば球面上)などを統一して扱うクラスを作りたい。これらに求められる機能はとりあえず 座標をつかってセルの要素にアクセス。 全てのセルをトラ…

istreambuf_iterator

キーを上手く割出すことができて早速解読!と思ったらどうもおかしい。 1.1.1の解答編にあるxorer.cをC++で書き直してみたけど途中からおかしくなる。 調べてみたらistream_iteratorが空白を無視することが原因だった。 こういうときはistreambuf_iteratorを…

インターフェースの設計に悩む

// pred(*beg1, *beg2)が真である間だけbeg1をインクリメントする template <class Iter1T, class Iter2T, class BinPredT> inline void advance_while(Iter1T& beg1, Iter1T end1, /* ここに悩む */, BinPredT pred){ // hogehoge }のような関数を今日実装したけどインターフェースにかなり悩んだ。 次の</class>…

cin と wcin の同時使用

boostの正規表現ライブラリで遊ぼうと思ってstd::wstringを初めていじってみてたら、次のような現象を発見 #include <iostream> using namespace std; int main(){ string str; wstring wstr; cin >> str; wcin >> wstr; cout << str << endl; wcout << wstr << endl; </iostream>…

テンプレートで再帰

Boost C++ Libraryの勉強をしていて今日覚えたこと。 テンプレートの特殊化とtypedefを使って型を変数、クラスを関数のように使っちゃおうというのがテンプレートメタプログラミングの考え方。 テンプレートメタプログラミングとはちょっと違う気もするんだ…