methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

C++のすばらしさ

http://d.hatena.ne.jp/w_o/20061005#p1
STLは、かなり複雑になってでも無駄なコピー等が一切起きないように頑張ってるのが素晴らしい。
たとえば、nth_element()とか、partial_copy()とか。あんまり使わないけど、sortだけだと、最初の4つが欲しいときとかに無駄にsortするのが許せない。

そして、なんでここまで無駄なコピーを嫌がるかというと、STLのコンテナには、参照じゃなくてオブジェクトそのものが入るから。コピーコンストラクタ搭載してたら何でも入るけど、コピー代入コストが大きい可能性があるから、コピーのコストを侮れない。

id:w_oの例でも、back_insert_iterator()のおかげで、一時的なリストを作らずに直接追加できる。

	list.push_back( 3);list.push_back(4);list.push_back(5);
	v.push_back( 100 ); v.push_back( 200 );

	std::transform( list.begin(), list.end(),
			std::back_insert_iterator<std::vector<int> >( v ),
			_1 * _1 );

参照とGCがあれば途中に無駄な配列が1つはいってもコピー代入コストが膨大とかにはならないから、たとえばPythonならこんな感じで満足してしまう。

>>> l = [3,4,5]
>>> v = [100,200]
>>> v += map(lambda x: x*x, l)     #無駄な一時リスト発生
>>> v
[100, 200, 9, 16, 25]
>>>