[過去ログ] Boostを語れゴラァ part4 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
247(3): デフォルトの名無しさん [sage] 2007/05/29(火) 20:50:28 AAS
$ cat ./test.cpp && g++ test.cpp && ./a.out
#include <iostream>
#include <deque>
#include <boost/lambda/lambda.hpp>
using namespace std;
using namespace boost::lambda;
int main ()
{
typedef deque <double> Container;
Container c0;
for (size_t i (0); i < 10; ++ i)
c0.push_front (i);
Container c1 (c0);
cout << "max: " << *max_element (c0.begin (), c0.end ()) << '\n';
for_each (c0.begin (), c0.end (), _1 /= *max_element (c0.begin (), c0.end ()));
cout << "c0: "; for_each (c0.begin (), c0.end (), (cout << _1 << ' ')); cout << '\n';
for_each (c1.begin (), c1.end (), _1 /= 9);
cout << "c1: "; for_each (c1.begin (), c1.end (), (cout << _1 << ' ')); cout << '\n';
return 0;
}
max: 9
c0: 1 8 7 6 5 4 3 2 1 0
c1: 1 0.888889 0.777778 0.666667 0.555556 0.444444 0.333333 0.222222 0.111111 0
最近lamdaを使いはじめました
c0とc1の内容が異なってくるのですがこれはしょうがないんですかね
このへんの解説ページなんかあれば教えていただけるとうれしいのですが
250(2): デフォルトの名無しさん [sage] 2007/05/29(火) 22:51:37 AAS
>>247
なんだこれ…
lambdaはデフォルトで定数項を参照で保存するのか。
constantで回避できるけど、なんでこうなってるんだろ。
251(1): デフォルトの名無しさん [sage] 2007/05/30(水) 00:41:06 AAS
>247
>250
脊髄反射で全くはずれた事を書きそうになったけど、ちょい調べてみた。
↓の通り、基本的に lambda は参照ではなくてコピーした値を保持している。
http://www.boost.org/doc/html/lambda/using_library.html#lambda.storing_bound_arguments
が、(↑にも書いてあるけど)複合代入演算子の左辺は参照で保存される(当たり前)。
で、(多分実装の手抜きのため?)左辺と右辺で参照か値かが異なる場合が対応されていないため、
/= の右辺も(const だけど)参照で受けてしまう。
cf. lambda/detail/operators.hpp
そのため、
_1 /= *max_element (c0.begin (), c0.end ())
の代わりに
_1 = _1 / *max_element (c0.begin (), c0.end ())
とすると、結果が c1 と同じになる。
252: 247 [sage] 2007/05/30(水) 03:18:16 AAS
>>250,251
よくわかりました
有難うございます
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.039s