エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

C++

Singleton Template

C++

http://d.hatena.ne.jp/nagoya313/20090930/1254321172を拝見して。これは「『奇妙に再帰したテンプレートパターン』を使うと簡単にできなかったっけ?」と、記憶をたどりながらコードを書いてみた。 #include <iostream> template<typename T> class Singleton { public: static T</typename></iostream>…

boost::dynamic_bitset

C++

ちょっと触れる機会があったので、わかったことを整理&記録。 #include <iostream> #include <boost/dynamic_bitset.hpp> int main(int, char* []) { boost::dynamic_bitset<> n; n.append(85); n.append(255); std::cout << n << std::endl; return 0; } 実行結果 0000000000000000000000001111</boost/dynamic_bitset.hpp></iostream>…

std::listに要素をまとめて追加する方法

C++

daiki41ti 【急募】std::listに要素をまとめて追加する方法 望んでいる解決法ではないかもしれないけれど。 #include <iostream> #include <list> #define numberof(array) (sizeof(array)/sizeof(*array)) int main(int, char* []) { int array[] = { 1, 2, 3, 4, 5 }; // </list></iostream>…

文字列の前後の空白文字の削除

C++

#include <string> #include <algorithm> #include <functional> #include <cctype> std::string trim(const std::string& s) { std::string::const_iterator left = std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace))); std::string::const_reverse_iterator right = std::f</cctype></functional></algorithm></string>…

C/C++スタイルのコメントの除去

C++

以前、ストリームから入力を得て、コメントを除去した結果をストリームに出力するを書いたことがあるんですが、いざ使ってみようと思うと使い勝手が悪い。ストリームが悪いわけではないけれど、読み込んだ文字列に対してコメント除去を施そうとするときとか…

初期化リストの途中で例外が発生したときの振る舞い

C++

コンストラクタの初期化リストの途中で例外が発生した場合、どんな振る舞いになるのか気になったのでためしてみました。 #include <iostream> #include <stdexcept> class Foo { public: explicit Foo(int id, bool bad = false) : id(id) { std::cout << "Foo::Foo(" << id << ")</stdexcept></iostream>…

定数マップに関する考察

C++

QuickSortから始まってここまできましたが、なにをしたかったかというと、ダブルディスパッチのエントリで書いたように、「ローコストのスタティックなしくみ」を実現するための試みでした。C++はライブラリでどうにかするタイプの言語なので、モダンな言語…

定数マップ

C++

昨日のエントリの続き。 ソート済み配列が手に入るとマップが作れます。ソートされていなくても線形検索すればいいんですが、それはそれ、効率よく検索したいじゃないですか。ソート済みなら二分探索ができるので、二分探索で実装した定数マップです。 以下…

ソート済みの定数配列

C++

後から拡張もせず、参照するだけなので定数配列で充分なんだけど、要素はソートされていてほしい…というときのために。 本当はコンパイル時に要素がソートされるといいんですが、思いつかなかったので次善の策として。 2009/06/16 訂正:operator []がconstに…

コンストラクタ/デストラクタ内での仮想関数の振る舞い

C++

デストラクタからオーバーライドされた仮想関数が呼べない - imHoリンク先のページにもあるように、C++ではでは構築時には先に派生元が構築され、破棄時には派生元が後に破棄されます。つまり、派生元のコンストラクタ/デストラクタが動いているときは派生先…

QuickSortの実装・補遺

少し整理。あとポインタだけでなく、イテレータ(ランダムアクセスイテレータ)でも使えるように記述を少し変更。 template<typename T> void swap(T& lhs, T& rhs) { T temp(lhs); lhs = rhs; rhs = temp; } template<typename iterator_t> void qsort(iterator_t begin, iterator_t end) { if(</typename></typename>…

QuickSortの実装を学習しなおしました

でも、釈然としないのはなぜだろう? template<typename T> void swap(T* lhs, T* rhs) { T temp = *lhs; *lhs = *rhs; *rhs = temp; } template<typename T> void qsort(T* begin, T* end) { if((end - begin) <= 1) return; T* left = begin; T* right = end - 1; T pivot = *right;</typename></typename>…

統計的に正しいランキングを行う方法をC++とかHaskellとかで書く

http://d.hatena.ne.jp/makiyamakoji/20090512/p1のコードを参考に(というか、ほとんど一緒ですが)C++で書き直してみた。 #include <algorithm> #include <stdexcept> #include <cmath> double calcNormalDistPercentile(double percent) { if((percent <= 0) || (1 <= percent)) { throw </cmath></stdexcept></algorithm>…

if N is included in X ...

C++

// 演算子を定義する部分 template<typename T, typename U> struct Operator { explicit Operator(const T& lhs) : lhs(lhs) {} const T& lhs; }; template<typename T, typename U> inline Operator<T, U> operator % (const T& lhs, U) { return Operator<T, U>(lhs); } enum ISINCLUDEDIN { isIncludedIn }; template</t,></t,></typename></typename>

メッセージのダブルディスパッチ

C++

…のサンプル。 GitHub - mattsan/MessagingSample メッセージオブジェクトを作るのにmapで生成関数を選択しているのにちょっとコストがかかる。実行時に初期化してるし。 メッセージの数や種類がプログラムの動作中に変化することは少ないので、これをローコ…

diffをつくる(3) -後編

C++

任意のコンテナに対してdiffをとれるようにテンプレートにしました。 ポイントはテンプレートになっているのが、diffの入り口Diff::ond関数だけというところです。このためdiffを求めるプログラムの大半をバイナリとしてライブラリ化することもできます。ま…

diffをつくる(3) -中編

C++

経路を記憶するしくみを追加し、実際に文字列を比較してみます。 コードの様子が変わったように見えるかもしれませんが、やっていることの実質はおなじです。 メンバのtree_に編集の操作(delete/common/add)がツリーとして記録されます。diffの最後で見つか…

diffをつくる(3) -前編

C++

「O(ND)」というのは、この手続きにかかる計算量のことですが、それがそのままアルゴリズムのことをさす言葉になっているようです。 詳しい解説はこのページなどをみてもらうとして、ともかく実装。 #include <string> #include <vector> #include <stdexcept> int snake(int x, int y, </stdexcept></vector></string>…

diffをつくる(2) -補遺

C++

diffをつくる(2)で掲載したコードは文字列を比較するコードですが、std::stringを他のコンテナに替えればそのコンテナどうしのdiffがとれます。 任意のコンテナのdiffをとれるようにテンプレートにしたものを掲載。この例ではstd::stringのdiffとstd::vector…

diffをつくる(2)

C++

昨日のコードでつくったグラフをもとに、SES(Shortest Edit Script)を見つけるコードを追加しました。体裁が変わったように見えますが、makeGraphまでは基本的に昨日と同じコードです。 今日のキモはfindSESのコード。もっとも少ない手順で一方の文字列から…

diffをつくる

C++

わけあって、diffを自作中。で、いろいろネット上で情報を集めている最中。 検索をかけてみるとこのページがあちこちからリンクされていたので、読んでいるんですが…後半部分がまだよくわかりません。 仕方がないので、理解したところまでコードに変換してい…

続・S式パーサ

C++

文字列(二重引用符で囲まれた文字列)と整数値を識別するようにしました。 パースに失敗した時にgotoで後始末に跳ぶようになっています。この部分、当初は例外で実装しようとしたんですがパースエラーは例外じゃないだろう、ということで書き直し。いろいろ言…

S式パーサ

C++

無駄にでかくなってしまいました。 半端ですがさらしておきます。できること: S式をパースしてオブジェクトにします。オブジェクトは出力できます。 (,),.,空白以外は全部識別しに使える文字扱いです。引用符とか関係ありません。

自作の中置演算子で広がる世界

C++

おとといのエントリで書いた演算子を、汎用的に使えるようにしてみました。 // Operators.h #ifndef OPERATORS_H #define OPERATORS_H template<typename T, typename U> struct Operator { explicit Operator(const T& lhs) : lhs(lhs) {} const T& lhs; }; template<typename T, typename U> inline Operator<T, U></t,></typename></typename>…

自作の演算子その2

C++

#include <iostream> // 例:三次元ベクトルクラス class Vec3 { public: explicit Vec3(double x = 0, double y = 0, double z = 0) : x_(x), y_(y), z_(z) {} double x() const { return x_; } double y() const { return y_; } double z() const { return z_; } Vec3</iostream>…

今日目にした驚愕のコード

C++

array.operator[](i); foo.operator=(bar); 普通より難しいことしていると思う…。 どうやってoperator overrideを学んだんだろう…註:「こんなことができるんだ」というのではなくて、「なんでわざわざ面倒な書き方してるんだ」という驚愕です。念のため

わたしはコンパイルスイッチがきらいです

// Foo.h #ifndef FOO_H #define FOO_H typedef struct foo_tag { int hoge; #if defined(USE_FUGA) int fuga; #endif int uhyo; } Foo; #endif//FOO_H // IncUhyo.cpp #include "Foo.h" void incUhyo(Foo* foo) { ++foo->uhyo; } // Main.cpp #include <stdio.h> #in</stdio.h>…

スマート列挙型その4

C++

なんか…ライフワークのようになっている賢い列挙型の追求。operator を∈と見立てて。 とりあえず9個まで対応。 #include <iostream> template<typename T, int N> class Set { public: Set(T a1, T a2) : value_(a1), set_(a2) {} Set(T a1, T a2, T a3) : value_(a1), set_(a2, a3) {} Se</typename></iostream>…

関数テンプレートの特殊化は、

C++

部分特殊化ができないのであって、全部指定してやればできるのか!! 関数テンプレートは特殊化できないとずっと勘違いしていた。あぁ、恥ずかしい。 template<typename result_t, typename arg_t> result_t hogehoge_cast(arg_t arg); enum Foo { Foo1, Foo2, Foo3 }; enum Bar { Bar1, Bar2, Bar</typename>…

googletestに手を出す

C++

シンプルで扱いやすいと耳にして、早速ダウンロード。 GitHub - google/googletest: Google Testサンプルコードを眺めているところですが、確かに簡単そう。試してみます。 最初のテスト #include <gtest/gtest.h> // テストされる関数 int add(int x, int y) { return x + </gtest/gtest.h>…