2011-03-01から1ヶ月間の記事一覧

Deleter を取る scoped_ptr

クラステンプレートの引数で deleter を取るものであれば、boost::interprocess::scoped_ptr があります。今回は、コンストラクタテンプレートの引数で deleter を取るものを C++0x で書いてみました。 GCC 4.6 で入った新機能 noexcept, nullptr も使ってい…

Immutable な片方向リスト

C++

書いてみました。GCC 4.5.2 以降 (-std=c++0x) 専用です。 https://gist.github.com/891955 標準の sequence container に似せてありますが、次の点で大きく異なります。 要素は変更できない insert, erase, clear などの操作を行うと、リスト自身は変更され…

foldr を書く

C++

foldr とは次のような関数です。 foldr :: (a -> b -> b) -> b -> [a] -> b foldr f z [] = z foldr f z (x:xs) = f x (foldr f z xs) これを C++ で書いてみます (foldr' を書きます)。 仕様は accumulate のものを copy and paste (+ modify) して以下のよ…

ネストされた range の入出力

実用には耐えませんが、ちょっとしたデバッグなどに。 入力をオウム返しする例 #include <deque> #include <iostream> #include <list> #include <vector> #include "./printed.hpp" #include "./scanned.hpp" int main() { std::deque<std::list<std::vector<int>>> rng; std::cin >> (rng | vitro::scanned); // >>> {</std::list<std::vector<int></vector></list></iostream></deque>…

split adaptor

リストの分割は 検索:デリミタを探す 分割:トークンのリストを作る(空のトークンを除去する、デリミタを残すなど) という2つの独立した操作に分解できると思ったので、2つの操作をポリシーでカスタマイズできるようなsplit iteratorを作り、それをベースに…

Boost.PPでクイックソート(改良版)

まず素直に再帰で実装したものがこちら。 http://ideone.com/3Sz2P 美しくありませんね。 マクロは再帰できないため、ループや再帰を実現するにはどこかでこのような連番マクロを使う必要があります。しかし、そういった汚れ仕事はBoost.PPのWHILEやSEQ_FOLD…