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 以降
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だと差がつくことが多い
102 名前:99 mailto:sage [2008/10/05(日) 16:14:17 ] なるほど、最適化すればx86なら変わらないのですね。ありがとう。 ちなみに、目的としては動的に確保できる多次元配列のアクセスを速く したいんだけれども。array[][][]と同程度の速度が出たりしますか。 ・・・なんて聞いてないで自分で実験してみればいいか^^; BOOSTはデフォルトでビルドできないためソースを人に渡せないから、 速度の関係ないアルゴリズム検証用にしか使ってません。
103 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:19:22 ] BOOST_FOREACHはビルドしなくても使える
104 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:27:35 ] >>103 そうじゃなくてboost入れてない人がいるって話だろ
105 名前:99 mailto:sage [2008/10/05(日) 16:48:34 ] そうです。使わない人にとっては、BOOST入れるのって結構面倒ですしね。 ソース書いて、アセンブラ見てみたんだけど、一見したところ変わらないみたい。 通常、静的な多次元配列array[a][b][c]ならば、連続で並んでるのが保障 されてるから、一発で目的のアドレスを参照できるから速い。 疑問なのが、動的な多次元配列の場合、 int ***ptr ptr = new int**[a] ptr[i] = new int*[b] ptr[i][j] = new int[c] とした時、 ptr[i][j][k]にアクセスすると、ptr[i]にアクセスして、入ってる番地を見 て、更に入ってる番地を・・ってのを繰り返すけど、メモリアクセスは通常 遅いので、動的配列は遅いのだけど。 で、普通に考えてvectorも同じような多重メモリアクセスをやってるような 気がするんだけど、遅くならないのかな。
106 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:56:16 ] vector<vector<vector<int> > >とかなら105のと同じように遅くなるだろと思う。
107 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 16:58:03 ] 仕方がない 行毎に列の大きさを変えられる利便性とのトレードオフ
108 名前:99 mailto:sage [2008/10/05(日) 17:16:38 ] うーむ、やっぱそうですよね。ありがとうございます。 僕のケースでは大抵の場合は行毎のサイズは固定で、初期化の時から変化 しないって場合が多いので、1次元配列で確保してます。例えば画像デー タみたいに、ユーザの入力にあわせて初期化サイズが変わるみたいな状況です。 この場合、データの規則性・連続性は保障されるので、構造的には静的多 次元配列と同じパフォーマンスが出せるはずですが、最適化してくれるものですか? もし可能なら、変数沢山のマクロから解放されてソースも読みやすくなるし、 メモリリークもしないから非常に素敵なんだけどな・・・。
109 名前:デフォルトの名無しさん mailto:sage [2008/10/05(日) 17:17:54 ] 長方形や立方体でよければ、1次元に詰め込んでv[i * x + j]とアクセスする方法が取れる。
110 名前:デフォルトの名無しさん mailto:sage [2008/10/06(月) 03:44:50 ] boost::multi_arrayもあるけどインタフェースが変態的なんだよな 結局の所自分で簡単なクラス作って使うのが無難
111 名前:デフォルトの名無しさん [2008/10/15(水) 12:18:18 ] vectorで配列を作って vectorの要素0から99までの最大値をmax_elementで求める vectorの要素100から199までの最大値をmax_elementで求める vectorの要素200から299までの最大値をmax_elementで求める 省略 という処理をしたいんですが、どのようにすればいいでしょうか?
112 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:22:41 ] a = *max_element(&v[0], &v[100]); b = *max_element(&v[100], &v[200]); c = *max_element(&v[200], &v[300]);
113 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:36:31 ] 省略
114 名前:デフォルトの名無しさん [2008/10/15(水) 12:37:38 ] ありがとうございます。 それで出来るはずだと思って試していたら、他の所でミスしてましたorz。 iteratorを使って ループ文中で if(count%100){ a=*max_element(iterator,ここが分からない); } という風にiteratorを基準に、後ろ100個目までを範囲指定することを出来ませんか?
115 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:41:30 ] ランダムアクセスイテレータなら a=*max_element(iterator, iterator + 100);
116 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 12:42:36 ] vectorなんだからランダムアクセスできるでしょ
117 名前:デフォルトの名無しさん [2008/10/15(水) 12:53:31 ] 出来ました!ありがとうございます!!
118 名前:デフォルトの名無しさん [2008/10/19(日) 00:12:46 ] 疑問なんだけど、vectorの配列から作ったiteratorってのは、 ポインタの配列なの?
119 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 00:21:37 ] 最適化の結果ポインタと同じような動作になるけど そのものじゃないはず
120 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 01:13:31 ] 実装によるんじゃなかった? 単にポインタをtypedefしている実装もあれば、classにしてる実装もあるって 聞いたような気がする夢をみたかもしれない
121 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 16:43:31 ] vectorの配列から作ったiteratorって言うと、 vector<vector<hoge> >::iterator のことかい。
122 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 17:21:14 ] 俺はvector<hoge>[N]のイテレータ、つまりvector<hoge> *のことかと思った でもどっちにしても話が合わない気がする
123 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 17:24:23 ] vi->begin() とか気持ち悪いコード初めて書いたわ
124 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 17:37:42 ] 別に普通かな
125 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 18:30:23 ] ハッシュテーブルの辞書みたいなもんだろ。
126 名前:デフォルトの名無しさん mailto:sage [2008/10/19(日) 18:44:13 ] まったく気持ち悪くないよ
127 名前:118 [2008/10/20(月) 09:02:02 ] >>121 ,122 vector<int>::iteratorみたいなもんです。書き方が悪かったですね。すみません 2Dライブラリだったらピクセルデータの配列を引数 3Dライブラリだったら座標データの配列を引数 にとる関数がありますけど、そういう関数にvectorで管理してるデータを 渡したいときは、どのようにしてますか? 私は、vectorに入ってるデータのサイズ分の配列を作って、そいつに入れてから ライブラリの関数に渡すってことをしてたんですけど、もっとスマートな方法って ないですか?
128 名前:デフォルトの名無しさん mailto:sage [2008/10/20(月) 09:33:27 ] vectorのイテレータがポインタだという保証はない でもvectorの内容がメモリ上で連続している保証はある だからvがvector<T>なら、Tの配列を要求する関数に&v[0]を渡しても大丈夫 イテレータitに対応するポインタを渡したければ&*itのようにすればいい
129 名前:デフォルトの名無しさん [2008/10/20(月) 12:26:11 ] わかりやすい解答ありがとうございます。 vector便利過ぎる
130 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 09:58:32 ] vectorでイテレータなんか使ったこと無いな。 Win32 APIを使う場合は、配列を使わない訳にはいかないから、 何番目という数字が必要な場合が出てくるし、 配列要素アクセスでは、i < vec.size()の記述でないとおかしいから。
131 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 10:52:18 ] >>130 のイテレータバージョンはたぶんこんな感じだな vectorでインデックスなんか使ったこと無いな。 algorithmを使う場合は、イテレータを使わない訳にはいかないから、 beginとendが必要な場合が出てくるし、 イテレータアクセスでは、i != vec.end()の記述でないとおかしいから。