前の記事でも言いましたが、ちょくちょくC++を勉強したいと思います。
まぁ闇の力を使おうとはあまり思っていなくて、本の少しのTemplateとSTLが使えるようになればよいかなと思って勉強をはじめました。
とりあえずlistを覚えたので確認のため何か組んでみることにしました。
Haskell(この話ばかりで申し訳ないですが)では強力なリストとリストを処理する函数群が揃っています。
その中でも特に便利な
map, filter, foldlを実装することにしました。
まずは以下に簡単な例を示します。
CODE:
map (+1) [1,2,3,4,5] -- => [2,3,4,5,6]になります
filter (>3) [1,2,3,4,5] -- => [4,5]になります
foldl (+) [1,2,3,4,5] -- => 15になります
foldl (*) [1,2,3,4,5] -- => 120になります
mapは与えられた函数を後ろのリストの要素全てに適用させます。
filterは与えられた条件を満たすもの要素のみ集めてきます。
foldlはリスト全体を前から与えられた函数で1つの値に畳み込みます。
さて、これらを実装したものが以下です。
► スポイラーを表示
CODE:
#include
#include
/*
Listの実験
Haskell:
map f [a, b, c...] = [f a, f b, f c, ...]
filter p xs = [x|xb)->[a]->[b]
template void map(T (&f)(S), std::list &a, std::list &b)
{
typename std::list::iterator it_a = a.begin();
while( it_a != a.end() ){
b.push_back(f(*it_a));
it_a++;
}
}
// filter :: (a->Bool)->[a]->[a]
template void filter(bool (&p)(S), std::list &a, std::list &b)
{
typename std::list::iterator it_a = a.begin();
while( it_a != a.end() ){
if( p(*it_a) == true )
b.push_back(*it_a);
it_a++;
}
}
// foldl :: (a->b->a)->a->[b]->a
template S foldl(S (&f)(S, T), S a, std::list &b)
{
S fold;
typename std::list::iterator it_b = b.begin();
while( it_b != b.end() ){
fold = f(a, *it_b);
a = fold;
it_b++;
}
return fold;
}
double add_double(const int a){ return a+0.5; }
bool even(const int a){ return a%2 == 0; }
int add(const int a, const int b){ return a+b; }
int multiple(const int a, const int b){ return a*b; }
int main()
{
std::list range_10;
std::list empty;
std::list empty2;
for(int i = 0; i (add_double, range_10, empty);
filter(even, range_10, empty2);
std::list::iterator it = empty.begin();
while( it != empty.end() ){
std::cout ::iterator it2 = empty2.begin();
while( it2 != empty2.end() ){
std::cout (add, 0, range_10) (multiple, 1, range_10) <;
参考文献:
[url]http://www.geocities.jp/ky_webid/cpp/language/index.html[/url]
[url]http://www.geocities.jp/ky_webid/cpp/library/index.html[/url]