1 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:01:17 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 9 pc11.2ch.net/test/read.cgi/tech/1204045410/ 過去ログ・リンク・書籍紹介は >>2 以降
2 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:02:03 ] 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 【C++】STL(Standard Template Library)相談室 7 pc11.2ch.net/test/read.cgi/tech/1185986999/ 【C++】STL(Standard Template Library)相談室 6 pc11.2ch.net/test/read.cgi/tech/1160821240/ 【C++】STL(Standard Template Library)相談室 5 pc8.2ch.net/test/read.cgi/tech/1143608073/ 【C++】STL(Standard Template Library)相談室 ;4 pc8.2ch.net/test/read.cgi/tech/1130680264/ 【C++】STL(Standard Template Library)相談室 3 pc8.2ch.net/test/read.cgi/tech/1116559700/ 【C++】STL(Standard Template Library)相談室 2 pc8.2ch.net/test/read.cgi/tech/1104898734/ 【C++】STL(Standard Template Library)相談室 pc5.2ch.net/test/read.cgi/tech/1095583235/
3 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:03:43 ] 入門ページなど ・入門 www.jah.ne.jp/~naoyuki/Writings/STL.html ・入門,一覧,使い方 www5c.biglobe.ne.jp/~ecb/cpp/07_01.html ・メソッド一覧 www.wakhok.ac.jp/~sumi/stl/ ・サンプルプログラム集 www.s34.co.jp/cpptechdoc/reference/stl_samples/ ・TIPS集 www.nantekotta.com/stl.html ・メルマガ www.kab-studio.biz/Programing/STLiostream/ ・解説 ja.wikipedia.org/wiki/Standard_Template_Library www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/programming/stl/about_stl.html マルチスレッドプログラミングの時には www.logos.ic.i.u-tokyo.ac.jp/~yokoyama/trash/stl_thread.html STLPort www.sgi.com/tech/stl/ www.stlport.org/
4 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:05:01 ] 書籍紹介 STL標準講座―標準テンプレートライブラリを利用したC++プログラミング www.amazon.co.jp/gp/product/4881357786/ STL―標準テンプレートライブラリによるC++プログラミング 第2版 www.amazon.co.jp/gp/product/4894714329/ 標準C++:STLの基礎知識 www.amazon.co.jp/gp/product/4756138047/ 標準講座C++―基礎からSTLを利用したプログラミングまで www.amazon.co.jp/gp/product/4881357050/ STLによるコンポーネントデザイン www.amazon.co.jp/gp/product/475613422X/ Effective STL―STLを効果的に使いこなす50の鉄則 www.amazon.co.jp/gp/product/4894714108/
5 名前:デフォルトの名無しさん mailto:sage [2008/08/26(火) 12:06:01 ] C++相談室 part63 pc11.2ch.net/test/read.cgi/tech/1217008269/l50 Boost総合スレ part6 pc11.2ch.net/test/read.cgi/tech/1207749841/l50 C++0x 4 pc11.2ch.net/test/read.cgi/tech/1214407525/l50
6 名前:デフォルトの名無しさん mailto:sage [2008/08/27(水) 09:34:44 ] >>1 乙
7 名前:デフォルトの名無しさん [2008/08/29(金) 00:12:00 ] 早速質問です。 set< set< int > > s; set< set< int > >::iterator i( s.begin() ); i->insert( 12 ); をコンパイルすると、 error: passing 'const std::set<int, std::less<int>, std::allocator<int> >' as 'this' argument of 'std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, _Alloc>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = int, _Compare = std::less<int>, _Alloc = std::allocator<int>]' discards qualifiers と言われる。 これは何が間違ってる?
8 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 00:37:34 ] ねぇねぇ。 >>4 の書籍紹介にも出てくるSTL標準講座(ハーバーと知るとちょw)なんだけど これのp.17中段(vectorの代表的なメンバ関数の紹介)に 「end()関数はベクタの最後の要素を指す反復子を返します」 って、書いてあるんだけど、これって間違いだよね? end()関数は末尾(最後の要素のひとつ後)を指すんだよね? 実際、 vector< int > v( 10, 1 ); vector< int >::const_iterator iter = v.end(); cout << *iter; みたいにやると、「デリファレンスできねーよ、ばーかばーか」って 実行時エラーがでやがりまくりやがりますりやがりますり。
9 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:01:37 ] 楽しいか?
10 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:04:46 ] うん。
11 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:11:33 ] >>8 死にな。
12 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:22:01 ] 死んだら、end()が最後の要素を指す様になりますか?
13 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:22:39 ] いや、お前が終わるだけ。
14 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:34:36 ] p.14の 「コンテナ内を巡回するには、 begin() で先頭を指す反復子を取得し、 反復子の値が end() と等しくなるまで反復子をインクリメントします。」 ってのも、実際にプログラムしたらエラーでる。 つか、気になったのは、シルト先生は for ループの条件に不等号を使うんだよね。 for ( int i = 0, i < 10, ++i )みたいに。 これはAccelerated C++ではやるべきじゃないって最初の方で書かれてる。 なぜなら、普遍の表明を正しく立てられなくなるし、エラーも発見しにくくなるから。 ループの終わりは正確に示すべきで、特に理由がなければ for ( int i = 0, i != 10. ++i )のように書く方が良い、と。 こうすれば、ループが [0,10) であることを正しく表明できる。 どっちを信じたらいいんだ。
15 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:38:46 ] 俺の個人的な嗜好でいうと、不等号のほうが好きだな。 簡単に要素のスキップとかできるし
16 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:50:51 ] ランダムアクセスイテレータには < が使えるが、そうでなければ使えない。 != は任意のイテレータで使用可能である。 従って、後でコンテナの種類を入れ替えたりする可能性があるので!= が無難である。 というのが、STLのイテレータに関する結論。 (コンテナの種類を変更するのは、そんな簡単な仕事じゃなかったりするが。。。) for 文の本体でカウンタの値を変更出来るのだから、 終了条件 i != 10 がいつも正しい表明とは限らない。 それが正しい表明なら != で書けば良いだろう。 i < 10 でも十分正しい表明であるケースは起こりうる。 ので、int カウンタに対しては、どちらでも良くて、時に応じて好きな方を選ぶ。 ただ、そんな細かい事より、もっと気を配るべき事は沢山ありそうだが。
17 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:58:10 ] >というのが、STLのイテレータに関する結論。 なるほど。納得。
18 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 01:59:47 ] で、結局、.end()はどこを指すのか。
19 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 02:03:10 ] 末尾であってるよ。
20 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 03:49:59 ] >>7 エラーメッセージを見る限り、i.operator ->の戻り値の型がconst set<int>になっているみたい。 これが正しいのか規格のsetのあたりみても分からなかった、すまん。
21 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 05:25:27 ] もっと単純な形、例えば以下の2つのコードを考える。 // OK! set< int > s; set< int >::iterator iter; s.insert( 12 ); iter = s.begin(); cout << *iter << endl; // Error! set< int > s; set< int >::iterator iter; iter = s.begin(); cout << *iter << endl; // ここでError イテレータ iter はコンテナ s の冒頭を指しているわけだが コンテナ s が空っぽだから、実際には何も指していない。 何も指していないものはデリファレンスできないのでエラーになる。 当然、存在しないオブジェクトのメソッドも呼び出せない。 なので・・・ set< int > base; base.insert( 0 ); set< set< int > > s; s.insert( base ); set< set< int > >::iterator i; i = s.begin(); i->insert( 12 ); のようにあらかじめなんか突っ込んでおけばOK。
22 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 06:25:27 ] >>7 ,20,21 set の iterator には const が付いてる。 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
23 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 10:34:55 ] キーなんだから、状態が変わるとコンテナが困った事になるわな。
24 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:06:41 ] vectorやmapの要素にvector<double>やvector<float>を混在させたいのですが、 そういうことは出来ないんですかね?
25 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:15:04 ] できるお
26 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:19:23 ] >>25 どうやってやるですかね? std::vector<std::vector> vec; vec.push_back(std::vector<float>); とかだと、vectorのtemplateの型を1行目で指定してないので、 compileがもちろん出来ないんですが。
27 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:30:04 ] 指定すればいいんだよ。
28 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:32:54 ] >>27 >>26 のvecの第一要素はvector<double>で、 第二要素はvector<float>にしたいという意味です。
29 名前:デフォルトの名無しさん mailto:sage [2008/08/29(金) 22:35:49 ] boost使っていいなら std::vector<boost::any> とか std::vector<boost::variant<std::vector<double>, std::vector<float> > >
30 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 01:08:15 ] boostすげぇぇぇぇぇぇぇぇぇ!
31 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 01:31:11 ] それほどでもない
32 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 01:49:20 ] >>31 そうだな お前が作ったんじゃないもんな
33 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 01:53:05 ] >>32 boostさんは謙虚なライブラリで大人気 あまり調子こくとリアルで痛い目を見て病院で栄養食を食べる事になる
34 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 05:33:14 ] boostはすごいと思うぜ? これを知ってるかどうかで生産性が違う
35 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 09:01:55 ] いろんな有名な本でもboost位は紹介されるしな
36 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 09:48:23 ] 一部が次期標準に採用されるくらいだしな
37 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 10:00:05 ] progress_displayも次期標準に入るんでしょうか?
38 名前:progress_display mailto:sage [2008/08/30(土) 18:19:55 ] 期待して待ってて欲しいお(`・ω・´)
39 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 21:33:29 ] progress_displayはC++0xには入りません
40 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 22:43:24 ] vectorで2次元配列を作って、任意の行を基準にソートするにはどうしたらいいすか?
41 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 22:45:46 ] BOOST_FOREACH
42 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 11:53:07 ] ファイル読み込んで、データ整理する際のみソートが1度だけあって それ以降、そのデータへのアクセスは走査のみの場合 vector と list、Dotch?
43 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 11:58:40 ] ランダムアクセスができソートが速いのがvector。 任意の位置への挿入削除が速いのがlist。 よってvectorかと。
44 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 12:47:33 ] STLportで_STLP_SHORT_STRING_SZを変更して使用してる人いる? 値を変更しても安全なんかな。
45 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 18:32:22 ] コンテナを持つクラスで コンストラクタ、デストラクタ内でclearするべき? コンテナ自身、コンストラクタ、デストラクタで clearは保証されてないんですか?
46 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 18:33:17 ] clearしなくていいよ
47 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 20:19:55 ] std::vector<union{int, int*}> hoge; みたいな、要素を共用するようなこと出来ませんか? unionをtypedefしちゃえばいいんだろうけど、 文を短くできないかなぁと思ったんですが…
48 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 20:33:20 ] boost::any
49 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 20:53:20 ] boost::variant
50 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 21:03:49 ] >>48 ,49 d
51 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 23:23:51 ] boostがすごすぎて濡れてきた。
52 名前:sage mailto:sage [2008/09/20(土) 23:20:38 ] vector<int> hoge(100); hoge[0]=41;hoge[1]=10;hoge[2]=20;hoge[3]=2;.... となってるときに、hogeからある決められた数字以下の列だけを先頭から順番に 抜き出したいのですが、一行で書けるでしょうか? よろしくお願いします。
53 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 23:26:32 ] std::transform(hoge.begin(), hoge.end(), to.begin(), std::bind2nd(std::less<int>(), n));
54 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 23:37:42 ] copy_ifがあれば簡単なんだが
55 名前:デフォルトの名無しさん mailto:sage [2008/09/20(土) 23:38:04 ] std::remove_copy_if(hoge.begin(), hoge.end(), std::back_inserter(hage), std::not1(std::bind2nd(std::less<int>(), n))); std::copy_ifでできるよ、と書こうと思ったら無かったorz C++0xマダー
56 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 10:20:11 ] hoge | pstade::oven::filtered(_1 <= boost::lambda::constant(n)); 0xで標準になるかもしれないrange baseの<algorithm>, <numeric>が楽しみですね
57 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 19:57:36 ] Effective STL第43項を参考に,独自のループをfor_eachを使ったものに書き換えています つまり, class Widget { public: void redraw() const; }; list<Widget> lw; for (list<Widget>::iterator i = lw.begin(); i != lw.end(); ++i) { i->redraw(); } 上記のようなメンバ関数を呼び出すようなループを下記のように置き換えています。(Effective STLからそのまま引用) for_each (lw.begin(), lw.end(), mem_fun_ref(&Widget::redraw)); 現在悩んでいる問題は multimap<int, Widget *> widget_map; for (multimap<int, Widget *>::iterator i = widget_map.begin(); i != widget_map.end(); i++) { i->second->redraw(); } このようなmapコンテナに対するループをどうやってfor_eachに置き換えるか…というものです。 for_each (widget_map.begin(), widget_map.end(), .... //これは無理 for_each (widget_map.begin()->second, widget_map.end()->second .... // イテレータでないのでやはり無理 なにか良いアイディアはあるでしょうか?
58 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:10:27 ] 関数を挟めばいいんだよ。 struct MapRedraw { void operator ()(std::multimap<int, Widget *>::value_type const& e) const { e.second->redraw(); } }; for_each(widget_map.begin(), widget_map.end(), MapRedraw());
59 名前:57 mailto:sage [2008/09/23(火) 20:13:42 ] >>58 なるほど メンバ関数のみを使うという方法に固執していました
60 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:16:15 ] スコット・メイヤーズ宣伝乙
61 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 20:25:17 ] 関数がポコポコ出てくるのがウザい
62 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:07:45 ] STLを勉強したての頃に抱いた強い期待に比べると、 まったくと言っていいくらい使う機会が無いなぁ、for_eachは。 まぁ、俺はそうだっていう単なるスタイルの話だけれど。
63 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 21:30:32 ] 0xで無名関数がかけるようになったら、もうちょっとfor_eachの出番も増えるはず。
64 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:02:57 ] 0x厨うぜぇ
65 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:24:07 ] 標準でこれぐらいできるようになって欲しい for_each(widget_map | map_values | indirected , bind(&Widget::redraw, _1));
66 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:26:14 ] >>65 最後のindirectedは要らなくないか?
67 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:44:55 ] >>65 確かにこの場合だと要らんね、指摘ありがとう
68 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:46:08 ] 訂正 × >>65 ○ >>66
69 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 22:53:22 ] lambda使えないとalgorithmって生きてこないんだよね
70 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 02:47:41 ] std::vectorを走査する時、 添字よりiteratorのが早いんですか?
71 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 03:04:51 ] イテレータがポインタの実装なら、operator[]関数を呼ぶオーバーヘッドの分だけ速いんじゃね。
72 名前:デフォルトの名無しさん [2008/09/27(土) 03:05:54 ] そんなんで変わるほど、コンパイラはへぼじゃない。 判りやすい単純な書き方をするのが一番
73 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 03:09:19 ] それは普通最適化で消える。 ただ、一般的な話をすると vectorはクラス/構造体であり、内部にポインタメンバを持っている。 そのため、[]で参照する時には、必ずメモリ上にベースアドレスを示す変数を読む必要がある。 一方、iteratorはただのポインタであり、レジスタ割付が可能。 そういう意味で、昔の「ポインタ/配列どちらが速い」論争とは意味が違う。 とはいえ、実装と最適化次第なのは当然。
74 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:58:29 ] ・ i < vec.size() より itor != vec.end() の方が実態を正確に表現している ・ algorithm に渡す時はイテレータ のような理由で、イテレータを使ったほうが、より C++ らしいとはいえるだろう。
75 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:48:13 ] またit++が遅いから++itにしろの話か
76 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:54:45 ] >>75 誰に言ってるの。
77 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:06:18 ] またC++が遅いから++Cにしろの話か
78 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:09:52 ] またC#が遅いからCにしろの話か
79 名前:デフォルトの名無しさん [2008/09/28(日) 12:46:14 ] 環境: VisualStudio 2008 find_ifアルゴリズムを使いたいのですが、 書籍やwebページを参照して find_if(v.begin(), v.end(), IsTestes); というふうに記述するとコンパイラがエラーを吐きます。 (IsTestedの行: error C3867: 関数呼び出しには引数リストがありません。 メンバへのポインタを作成するために & を使用してください) &を付けて関数ポインタにしても解決しませんでした。 これはVS2008がヘンなの? 俺が何か見落としてる?
80 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:48:44 ] IsTestes側がまずいと思われ 関数オブジェクトでぐぐるべき
81 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:30:09 ] >>80 ありがとうございます。 関数オブジェクトに変えたら通りました。
82 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 13:56:19 ] >>73 実装の話だが、VC++のChecked Iterator有効状態だとiteratorアクセスが遅く、 vectorの単なる走査だと生ポインタ取り出してインクリメントしたほうが速くなる 結果というのをどっかで見た
83 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 22:32:49 ] デバッグ版で速度を気にしても仕方がない
84 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:08:56 ] >>82 デフォルトで安全なほうに振ってるからな それ知らずにベンチマークして「遅いwww糞杉www」 って言ってる奴マジ恥ずかしい
85 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:16:07 ] サンプルコードに下記のコードがあったのですが解説がないので どのような動きをするのかわかりません・・。 誰か簡単に教えていただけませんか //------------------------------------------------------------ //STLの補助マクロ // // #define foreach(type,obj,i) \ for(type::iterator i=(obj).begin();(i)!=(obj).end();(i)++) #define const_foreach(type,obj,i) \ for(type::const_iterator i=(obj).begin();(i)!=(obj).end();(i)++)
86 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:24:03 ] >>85 解説しろといわれてもこまるほど 簡単なというか基本的なことしかでてきてない コードなんだがなにが分からないの? イテレータ知らないの?
87 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:10:28 ] >>85 typeにはstd::vectorとかのコンテナ型を指定する。objはそのインスタンス。iはイテレータを使ったループ変数だ。 こんな風に使う。 std::vector<int> vecx; (略). foreach(std::vector,vecx,i) { std::cout<<*i; }
88 名前:デフォルトの名無しさん [2008/10/04(土) 05:58:22 ] 今時のコンピュータ早くて 多少重い部品使っても全然平気。
89 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 09:28:46 ] C++でそんなマクロを作る意味あんの?
90 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:03:46 ] マクロじゃないとできへんのや・・
91 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:42:58 ] >>85 のマクロだけど 「#define foreach(type,obj,i)」のtypeを無くして引数を2個だけにできますか? 何に使うかはともかくとして、ちょっと気になった。
92 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 11:54:38 ] >>91 BOOST_FOREACHを使う。
93 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:06:59 ] BOOST_FOREACHもマクロなんですがw
94 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:19:19 ] でっていう
95 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 12:53:53 ] VC++なら8からfor eachが使える。
96 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:37:59 ] BOOST_FOR_EACHを使うとループを二重にも三重にも出来る std::vector<std::vector<int> > vec(10, std::vector<int>(10)); BOOST_FOREACH(std::vector<int>& row, vec) BOOST_FOREACH(int& i, row) i = 999;
97 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 13:44:59 ] >>91 autoを使う
98 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 01:30:25 ] >>97 autoは別スレの話題だ typeofならギリギリ可
99 名前:デフォルトの名無しさん [2008/10/05(日) 15:35:23 ] vectorへのアクセスを速くする良い方法ってありますか? いま、 for(vec::iterator it=vec.begin();it!=vec.end();it++) access to *it を for(int i=0, int num=vec.size(), Type *ptr=&vec[0];i<num;i++) accsess to ptr[i]; とかやっちゃってます。
100 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 15:42:29 ] >>99 BOOST_FOREACHを使うとend()がキャッシュされる分高速化されるらしい。
101 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 15:57:14 ] endをキャッシュするより >>99 のように 数値変数でループ回数を制御する方が速いことが多い x86のような性能優先のCPUならどっちでも変わらないが 組み込みに使える普通のCPUだと差がつくことが多い