- 2009-11-11 (Wed) 01:06
- プログラミング
gccのsvnにある4.5.0ならc++0xのλ式が使えるのでgccをコンパイルしてインストールしてみた.
とりあえず std::transform を一行でかけるのかなぁと以下のコードを書いてコンパイル.オプションに -std=gnu++0xを指定.
#include <iostream> #include <algorithm> #include <vector> int main(int argc, char *argv[]) { std::vector<int> x; int n = 10; for(int i = 0; i < n; i++) x.push_back(i); for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it); std::cout << std::endl; std::transform(x.begin(), x.end(), x.begin(), [](int a) { return (a + 1) ^ 7;}); for(auto it = x.begin(); it != x.end(); it++) std::cout << " " << (*it); std::cout << std::endl; return 0; }
そしたら普通にコンパイルが通って,実行したら配列要素がちゃんとインクリメントされていた.
ちなみに,上のプログラムのtransformのメインループは
L42: movl (%rax), %edx addq $1, %rcx addl $1, %edx xorl $7, %edx movl %edx, (%rax) addq $4, %rax cmpq %rcx, %rbx ja L42
のようにコンパイルされた(-O3 オプションで).λ式だと変なオーバーヘッドが入らないらしい.boostのlambdaないしfunctionsあたりだと変なオーベーヘッドが掛かってたけど,c++0xのλ式だとその心配がなく簡単に使える.ただし,このλ式を変数に代入したりしたときにどうなるかはまだ試してない.
- Newer: AWK - はじめ