週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(この記事は Functional Ikamusume Advent Calendar jp 2010 の為に書かれました)

手続き型を支配するチャンスでゲソ!今日こそギャフンと言わせてやるでゲソ!

#include <iostream>
#include <string>

using namespace std;

int main(void) {
  string s = "イカ娘!";
  for (int i = 0; i < 6; ++i)
    s = "侵略!" + s;
  cout << s << endl;
}


ループを再帰にするでゲソ。

#include <iostream>
#include <string>
using namespace std;
string f(int i) {return i?"侵略!"+f(i-1):"イカ娘!";}
int main(void) {cout << f(6) << endl;}


さらに再帰を末尾再帰にするでゲソ。

#include <iostream>
#include <string>
using namespace std;
string f(int i, const string& s) {return i?f(i-1,s+"侵略!"):s+"イカ娘!";}
int main(void) {cout << f(6,"") << endl;}


C++にはfoldがあるじゃなイカ。手で再帰を書く必要はないでゲソ。

#include <iostream>
#include <numeric>
#include <string>
#include <vector>

using namespace std;

int main(void) {
  const string s = "イカ娘!";
  const vector<string> v(6, "侵略!");
  cout << accumulate(v.begin(), v.end(), s) << endl;
}

間違ってなイカ? 順序が逆でゲソ。

#include <iostream>
#include <numeric>
#include <string>
#include <vector>

using namespace std;

string rev(const string& lhs, const string& rhs) {
  return rhs + lhs;
}

int main(void) {
  const string s = "イカ娘!";
  const vector<string> v(6, "侵略!");
  cout << accumulate(v.begin(), v.end(), s, rev) << endl;
}

これで正しいんじゃなイカ?


さらに無名関数を使うでゲソ。

#include <iostream>
#include <numeric>
#include <string>
#include <vector>
#include <boost/lambda/lambda.hpp>

using namespace std;
using namespace boost::lambda;

int main(void) {
  const string s = "イカ娘!";
  const vector<string> v(6, "侵略!");
  cout << accumulate(v.begin(), v.end(), s, _2 + _1) << endl;
}


accumulateがfoldlなので、foldrを定義するでゲソ。

練習問題: ここを埋めなイカ。


コンパイル中に文字列を構築するでゲソ。

#define BOOST_MPL_LIMIT_STRING_SIZE 150
#include <iostream>
#include <string>
#include <boost/mpl/char.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/string.hpp>

using namespace std;
using namespace boost::mpl;

template <typename T1, typename T2>
struct concatenate : public fold<T2, T1, push_back<_1, _2> > {};

int main(void) {
  cout << c_str<fold<
      range_c<int, 0, 3>,
      boost::mpl::string<'イ','カ','娘','!'>,
      lambda<concatenate<boost::mpl::string<'侵','略','!'>, _1> > >::type
    >::value << endl;
}

6つだそうとしたらマシンが反応しなくなったでゲソ。貧弱じゃなイカ?

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。