# C++11 Advent Calendar 2011 のエントリです。
# 出遅れてごめんす。しかも使い古したネタですんません _o/L
C++11 の一番のウリはラムダ式やと思うてます。
関数オブジェクトをそのまま書き下せるわけだからSTLと相性バツグンなのね。
んでもって Intel TBB あるいは Microsoft PPL なんてなマルチスレッド・ライブラリ
を使ったプログラムがめっさ楽になります。スレッド内で動くタスクをラムダ式で書ける。
僕の愛機が論理4コアな i7-2600K に増強されたもんだから、
マルチスレッド・アプリケーション書くのが楽しくてたまらんです。
たとえばソート。与えられたデータ列 [first,last) を
小さい値の半分 [first,mid) と 大きい値の半分 [mid,last) に振り分けます。
んでもってそれぞれに対しソートする。
ここんとこでふたつのタスクを並行動作させちゃるです。
#define _SCL_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <iterator>
#include <ppl.h>
#include <time.h>
#include <cassert>
using namespace std;
using namespace Concurrency;
const size_t limit = 100;
template<typename Iterator>
void quick_sort(Iterator first, Iterator last) {
auto size = distance(first,last);
// limitに満たない大きさならふつーにソート
if ( size < limit ) {
sort(first,last);
} else {
// 前半と後半に分割し
Iterator mid = first;
advance(mid, size/2);
nth_element(first,mid,last);
// ふたつのソートをパラレルに(ここでラムダ式の出番!)
parallel_invoke(
[&]() { quick_sort(first, mid); },
[&]() { quick_sort(mid, last); }
);
}
}
/*
* おためし: 百万個のintをソートするなり
*/
int main() {
const size_t N = 1000000;
vector<int> data0(N);
vector<int> data1(N);
iota(begin(data0), end(data0), 0);
random_shuffle(begin(data0), end(data0));
copy(begin(data0), end(data0), begin(data1));
clock_t t;
t = clock();
sort(begin(data0), end(data0));
t = clock() - t;
assert( is_sorted(begin(data0), end(data0)) );
cout << "sort : " << t << endl;
t = clock();
quick_sort(begin(data1), end(data1));
t = clock() - t;
assert( is_sorted(begin(data1), end(data1)) );
cout << "sort : " << t << endl;
}
実行結果:
sort : 77
quick_sort : 31
スピードに定評のあるstd::sortより倍速いっすよ♪