Boost.勉強会#4
dtl - diff template library
View more presentations from cubicdaiya
Boost.勉強会 #4にて発表してきました。アルゴリズムの解説については参考資料へのリンクを紹介するに留めてdtlのライブラリとしての機能の紹介に内容を絞り、若干ネタにも走りましたが、概ね好評だったようです。
Boostというか本格的なC++系の勉強会に参加するのは今回が初めてで何かと刺激になりました。次回もぜひ参加したいと思います。
発表に関する捕捉
dtlで扱えるデータ型について
発表の際、「どんな型でも差分取れる!」的なことを言ってしまったようなんですが、実際には対象要素列のコンテナがrandom access iteratorを備えている必要があります。なのでコンテナにはvector(かdeque)を使うのがよいでしょう。ソースコードにも「sequence must support random_access_iterator.」ってコメントを書いてるのですが、言うのをすっかり忘れておりました(_ _)。
要素の型については大抵の場合問題ありませんが、デフォルトでは要素の比較は==演算子によって行われるため、特別な比較をしたい場合はカスタムコンパレータを作成する必要があります。例えば、要素の比較の際にアルファベットの小文字と大文字の区別をしたくないなら以下のようなコンパレータを作成し、
class CaseInsensitive: public dtl::Compare<char> { public: bool impl(const char& a, const char& b) const { return tolower(a) == tolower(b); } };
Diffクラステンプレートのパラメータにさきほど作成したコンパレータを指定します。
std::string A("abc"); std::string B("abd"); dt::Diff< char, std::string, CaseInsensitive > diff(A, B);
githubにUpされてるWuのアルゴリズムの実装言語一覧に○○○がねぇぞゴルァ ( ゚Д゚)という方へ
https://github.com/cubicdaiya/onp
ぜひgithubにてフォーク -> 実装 -> pull requestしてください。お待ちしております。