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だと差がつくことが多い
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()の記述でないとおかしいから。
132 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 12:22:45 ] つか、>>130 が vector で iterator 使ったことがあるかどうかなんて 地球上の誰も興味のない話を唐突にされても。
133 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 19:53:51 ] 内部でやってることは一緒じゃないの
134 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 20:01:15 ] いや、vector のイテレータとか、型が分からないと使えないしめんどいー インデックスでいいじゃんでも C++ 使うならイテレータつかったほうがいいのかなーどうしよー と迷うに迷って混在させてgdgdになってる俺みたいな人には重要な話
135 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 20:26:30 ] C配列との橋渡し的な役目もあるしね。使う人/使わない人がいるのは当然かと。
136 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 20:51:16 ] >>134 対象のvectorが見えてるのに型が判らないってどういう状況だ?
137 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:01:51 ] いちいちstd::vector<foo>::iteratorと書くのが面倒だと言っているだけだと思う。 早くautoが欲しい。
138 名前:デフォルトの名無しさん mailto:sage [2008/10/21(火) 21:04:22 ] どっちも似たようなものだし、いざとなれば相互に変換できるし、どうでもいい
139 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 13:30:52 ] 構文糖は重要だよ 各種LL言語が有用性を示してるじゃん
140 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 13:36:50 ] イテレータとポインタは構文糖の関係にはない
141 名前:デフォルトの名無しさん [2008/10/22(水) 19:03:29 ] >>137 typedef 一回書けば解決
142 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 21:04:19 ] double型 と char型のメンバを持つ構造体をvectorにいれて、全要素入れ終わったらソートみたいにしてるんですけど、 mapとかつかったらもっと効率よくなりますか?ソートするキーはdouble型の値で、降順です。
143 名前:デフォルトの名無しさん [2008/10/22(水) 21:30:53 ] ファイルからや手からの入力ならset使えば、ソート時間はほぼ無い。 読み込んでいる間にソートされるので。 もしメモリ間の転送であっても速いとは思う
144 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 21:40:54 ] mapじゃなくてpairかもしれません。 pairでdouble型とchar型のメンバを作って、doubleをキーにソートって感じにしたいんですが、どうしたらいいですか? char型のメンバは重複する場合もあります。
145 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 21:46:00 ] 扱う要素数によるよ。 整数とかポインタなら、数千まではvectorの方が一般的に他のコンテナよりも速い
146 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 21:49:31 ] つまりvectorにガシガシいれてあとからソートですか?
147 名前:デフォルトの名無しさん [2008/10/22(水) 21:50:32 ] 実測しよう
148 名前:デフォルトの名無しさん [2008/10/22(水) 21:51:29 ] それほど速度を気にしないなら、setにぶち込むのが簡単。 いれたらソート終わっているので
149 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 21:52:15 ] そんなに速度は気にしません。あまりにも比較して遅いなら別ですが
150 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:02:12 ] 気になるなら測れ、としか。
151 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:03:05 ] 速度気にしてないのか
152 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:13:56 ] 気にしてないわけではありません。 実測してみます
153 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:18:40 ] typedef struct{ double dist; char name[20]; }DIST; int main(){ std::set<DIST> distance; distance.insert( 200 ); →2要素を代入するにはどうすればいいですか? }
154 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:22:03 ] >>153 DIST型のオブジェクトを渡すべきところへ200を渡してどーすんですか
155 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:36:25 ] あらかじめvectorでサイズを決め打ちするなら早いけど、 領域を増やしていくならsetのほうがはやい
156 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:37:13 ] >>154 渡し方がわかりません。ソートに使うキーはdoubleのほうです
157 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:40:53 ] >>153 std::pairでくるんで渡せ
158 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:54:03 ] こんなんでどう? struct DIST { double dist; char name[20]; DIST(double d, char* str) : dist(d) { std::strcpy(name, str); } friend class Comp; }; struct Comp { bool operator()(const DIST& d1, const DIST& d2) const { return d1.dist < d2.dist; } }; int main() { std::set<DIST, Comp> distance; distance.insert(DIST(200, "abc")); //→2要素を代入するにはどうすればいいですか? distance.insert(DIST(100, "def")); distance.insert(DIST( 50, "ghi")); for (std::set<DIST, Comp>::const_iterator pos = distance.begin(); pos != distance.end(); ++pos) std::cout << pos->dist << ", \"" << pos->name << "\"\n"; }
159 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:54:46 ] distance.insert( std::pair(200.0 ,"moziretu") ); こうですか?
160 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:56:05 ] >>158 通りません・・・
161 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 22:56:51 ] >>160 これ頭に付けてるよな #include <iostream> #include <cstring> #include <set>
162 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 23:02:07 ] >>161 コピペみすってました・・・ struct DIST { double dist; char name[20]; DIST(double d, char* str) : dist(d) { std::strcpy(name, str); } friend class Comp; }; struct Comp { bool operator()(const DIST& d1, const DIST& d2) const { return d1.dist < d2.dist; } }; これがどういうことをしてるのかわかりません。
163 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 23:07:19 ] >>162 まず二要素を一度に代入できるように、DISTにコンストラクタを付けた。 こうする事によって一時オブジェクトが生成できるようになる。 次にソートの基準をdoubleにするために、叙述関数もしくは関数オブジェクト を書かなければならないが、この場合は関数オブジェクトを書いている。 というのもstd::setのデフォルトの比較基準はless<DIST>となり、これは 存在しないので、自分で書かなければならないからだ。そこで比較関数 オブジェクトにCompを使う事にして自分で書いている。
164 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 23:09:37 ] classがstructになっててなんかおかしいよ
165 名前:デフォルトの名無しさん mailto:sage [2008/10/22(水) 23:20:44 ] >>164 わかったよこれでいいだろ class DIST { double dist; char name[20]; public: DIST(double d, char* str) : dist(d) { std::strcpy(name, str); } double getdist() const { return dist; } const char* getname() const { return name; } friend class Comp; }; struct Comp { bool operator()(const DIST& d1, const DIST& d2) const { return d1.dist < d2.dist; } }; int main() { std::set<DIST, Comp> distance; distance.insert(DIST(200, "abc")); //→2要素を代入するにはどうすればいいですか? distance.insert(DIST(100, "def")); distance.insert(DIST( 50, "ghi")); for (std::set<DIST, Comp>::const_iterator pos = distance.begin(); pos != distance.end(); ++pos) std::cout << pos->getdist() << ", \"" << pos->getname() << "\"\n"; }
166 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 02:37:33 ] おまえら暇だな… DIST dist; distance.insert(dist);
167 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:19:10 ] func(string hoge){ } という関数に char mozi[256];で宣言された文字列をfunc(mozi)みたいに渡せますか?
168 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:20:02 ] ええ
169 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:21:30 ] なんでそんなことができるんですか?
170 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:23:21 ] stringのコンストラクタにconst char*を取るものがあるから
171 名前:デフォルトの名無しさん mailto:sage [2008/10/23(木) 19:26:39 ] なるほど!STLってほんとにすごいですね
172 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 00:21:21 ] でもSTL関係ないですね!
173 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 03:20:25 ] stringはSTLだろ basic_string<char>でテンプレートだし。
174 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 04:09:49 ] >>173 馬鹿発見
175 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 08:24:14 ] >>173 ん・・あぁ・・そうだね・・・・
176 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 10:01:54 ] >>173 const char *を引数にとるコンストラクタを持つ文字列クラスは、STL固有ではありません。
177 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 17:43:47 ] んなこたーない
178 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 18:02:21 ] 自前で似たようなモノを作れるのに?
179 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 18:47:47 ] >>176 const T* だよ >>178 STLであろうがなかろうが全部自前で似たようなものを作れるぞ
180 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 20:47:06 ] なんか話が噛み合ってない
181 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 21:03:12 ] わかってないんだよ、おそらく本当にw
182 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 21:23:12 ] ということにしたいのですね。
183 名前:デフォルトの名無しさん mailto:sage [2008/10/25(土) 21:36:55 ] はいはい模範回答。 もともとのAlexanderのSTLにはbasic_string<>は無かった。 しかし、標準化の過程でSTLコンテナに適合するようにされた。 basic_string<>がalgorithmと重複するようなメンバ関数を持っていたり、 しかもそれがイテレータではなくsize_typeを扱ったりするのはその名残。
184 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 10:23:42 ] >>173 の >basic_string<char>でテンプレートだし。 てのが気になるなあ… 「stream I/O もテンプレートだからSTL」とか言い出しかねない勢い。
185 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 12:46:36 ] 入念に勉強してない限り、 「C++コンパイラに付いてくるtemplate classを使ったもの全部=STL」 と思っている人は多い気がする 実用上困る事項でもないし・・・
186 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 15:08:26 ] 定期的に出る話題だから 今回も「ああ、またですか」てなもんだ。 でもbasic_stringはもう 仲間に入れてあげてもいいと思うんだ。
187 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 16:00:31 ] やだよ basic_stringなんてC++標準化委員会も「失敗作だった」と 認めているじゃないか
188 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:21:30 ] そこまで言ってたっけ。
189 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:55:00 ] >>186 たまにこのスレを斜め読みするものとしては そういう話が定期的に回ってくれると 自身の無知加減がよくわかるから助かるよ。 basic_stringって曰くがあったのか・・・(´・ω・)
190 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:35:54 ] >>187 ソースくれ
191 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:47:14 ] 標準化委員会はSTL自体が「失敗作だった」って 認めてたぞ
192 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:50:21 ] 標準化委員会はC++自体が「失敗作だった」って 認めてたぞ
193 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 04:45:29 ] 親は>>192 自体が「失敗作だった」って 認めてたぞ
194 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 11:11:11 ] 俺は「性交作だ」って聞いた
195 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 11:40:21 ] おあとがよろしいようで
196 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:20:17 ] 100個ぐらいの文字列を入れて そのなかで一番出現率が高い文字列を探すには STLのどんなデータ構造とアルゴリズムをつかえばいいでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:43:38 ] まず服を脱ぎます
198 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:44:07 ] 次にソートします
199 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:48:02 ] かぜひきました
200 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:51:58 ] 相当大変な事態ですね。
201 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:02:46 ] 手術は成功です
202 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:25:40 ] そーっとしておいてくださいね
203 名前:デフォルトの名無しさん [2008/10/28(火) 21:27:19 ] 真面目な解答お願いします
204 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:32:40 ] std::map<string,int>で出現頻度数えれば?
205 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:36:06 ] 質問です。 struct a { func() {} }; struct b { vector <a> va: }; とあって、for_eachアルゴリズムでva内のfuncを呼び出すには どのような書き方をすればいいのでしょうか?mem_fun_refと bind2ndを組み合わせるのでしょうか?
206 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:44:53 ] 自己解決しました。mem_fun_refだけでいいようです。
207 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:11:52 ] >>204 連想配列ですよね?stringがキーでintが値ってことですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:14:09 ] hash
209 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:17:42 ] map<string,int> mとすると、m[str]++としてあとはソートなりなんなりすりゃいい
210 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:30:23 ] map<string,int> test; test["hoge"]++; sort(test.begin(), test.end(), greater<int>()); こうですか?
211 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:40:03 ] mapってソートできないだろ 挿入した時点でキーで自動的にソートされてるんだから 全部要素を挿入したらvectorにでも全要素をコピーして 今度はint基準でソートすればよい
212 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:41:26 ] なるほど。どうりでコンパイルが・・・ ちょっとやってみます
213 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:43:39 ] vectorにキーと値の構造体をコピーするんでしょうか? 最大値を知りたいのではなく、最大値をとるキーをしりたいんです
214 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:51:17 ] 脳味噌を使え脳味噌
215 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:55:46 ] 何か汚ねえなあ・・・lambdaを使わないとやっぱ綺麗に書けんわ struct Comp : public std::binary_function<std::pair<std::string, int>, std::pair<std::string, int>, bool> { bool operator()(const std::pair<std::string, int>& v1, const std::pair<std::string, int>& v2) const { return v1.second < v2.second; } }; void print(const std::pair<std::string, int>& v) { std::cout << "string = '" << v.first << "', count = " << v.second << std::endl; } int main() { std::map<std::string, int> msi; std::vector<std::pair<std::string, int> > vsi; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["def"]++; msi["def"]++; msi["ghi"]++; msi["ghi"]++; msi["ghi"]++; msi["ghi"]++; for (std::map<std::string, int>::iterator pos = msi.begin(); pos != msi.end(); ++pos) vsi.push_back(std::make_pair(pos->first, pos->second)); std::sort(vsi.begin(), vsi.end(), Comp()); std::for_each(vsi.begin(), vsi.end(), print); }
216 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:58:14 ] わざわざmapにするいみあんの?
217 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:59:29 ] なんか複雑ですね・・・ ちょっと解読してみます
218 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:01:17 ] >>216 挿入が楽 それだけ
219 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:03:53 ] ああ強いて言えば挿入が速いか・・・
220 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:04:51 ] 「一番」出現頻度高いのが欲しいだけなら、わざわざソートまでする必要なかろ O(n)で済むぞ
221 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:05:45 ] >>220 えっとどうするんですか?
222 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:07:06 ] mapに突っ込んだ後で、単に全舐めすりゃいいだろ シークエンスの最大値を求めるのにいちいちソートするのか?お前さんは
223 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:09:36 ] まあそうだな イテレータを回すだけ 最大値が知りたいだけならそれでいい
224 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:11:33 ] まあただ最大値の文字列の候補が複数あった時は少々工夫が必要か
225 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:12:10 ] 最大値にタイがある場合も考慮せにゃならんな 単純でいて意外と深いのかもしれないw
226 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:17:42 ] int main(){ string str; map<string,int> test; int maxval=0; int maxkey; test["hoge"]++; test["hoge"]++; test["huga"]++; map<string, int>::iterator itr = test.begin(); map<string, int>::iterator itrEnd = test.end(); while(itr != itrEnd){ itr++; } } こうしたんですが、値自体はどうやって参照するんですか?
227 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:21:00 ] itr->second
228 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:23:12 ] ああそうかpairのコンテナなんですよね
229 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:25:51 ] int main(){ string str; map<string,int> test; int maxval=0; string maxkey='\0'; test["hoge"]++; test["hoge"]++; test["huga"]++; map<string, int>::iterator itr = test.begin(); map<string, int>::iterator itrEnd = test.end(); while(itr != itrEnd){ if(itr->second >maxval){ maxval = itr->second; maxkey = itr->first; } itr++; } cout << "maxkey:" << maxkey << endl; } コンパイルはできるんですが、とまります・・・
230 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:27:09 ] >>224-225 そうなんですよね。その辺は工夫でできそうです
231 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:29:41 ] タイを考慮しても2回舐めればいいだけだから、たいした問題ではないか なんちって
232 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:30:49 ] タイがあっても3つ以上はことはないとおもうんで、大丈夫そうです。 しかし動かないです・・・
233 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:34:12 ] >>229 >string maxkey='\0'; が良くない。これはstring maxkey=NULL; と同じ意味になる。 つまりアドレス0をアクセスする文字列で初期化しようとする。
234 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:35:44 ] 基本からやった方がいいんじゃ・・・
235 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:37:58 ] >>233 if文内で代入するので問題ないかと思ったんですが・・・ >つまりアドレス0をアクセスする文字列で初期化しようとする。 ??
236 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:38:35 ] 微妙に誤解を招きそうなので訂正 ×つまりアドレス0をアクセスする文字列で初期化しようとする。 ○つまりアドレス0から始まるC文字列で初期化しようとする。 処理系によっては文字列が大きすぎて止まり、他の処理系では アドレス0をアクセスするのでセグメントエラーで止まったりする。
237 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:39:17 ] 正しくはstring maxkey=""; あるいは単にstring maxkey でいい。
238 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:40:39 ] >>235 charだけを引数に取るコンストラクタがないため、 暗黙の変換でconst char*を引数に取るコンストラクタが呼ばれてしまう。
239 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:40:40 ] わかりました。親切にありがとうございました
240 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:51:42 ] つーか、'\0'はintじゃね?
241 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:55:17 ] あとまだ質問が・・・ map<string,int> test; while(){ if(条件){ } } として、条件が成立したときだけ、testを初期化(すべてのキーに対して値を0にしたい)したいのですが、どうすればいいですか?
242 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:55:37 ] >>240 だから、std::string::string(0) が呼ばれてしまう。 この意味をよく考えてみろ。
243 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:59:24 ] >>241 イテレータを回して全てのsecondに0を代入するしかないだろ
244 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:00:28 ] if(){ map<string,int> test; } ではだめですか?
245 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:04:15 ] >>244 それはまずい。if文の外側のtestが隠蔽されてしまう。
246 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:08:10 ] ネタとマジレスの見分けがつかない
247 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:08:27 ] map<string,int> test; while(){ if(){ map<string,int> test; } } でもですか?
248 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:10:01 ] >>247 同じ事だ。 >>246 うむ・・・釣られてるのやもしれぬ
249 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:15:38 ] 決して釣りとかじゃありません。知識不足ですいません。
250 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:19:30 ] 釣りじゃないなら ・差し当たってSTLよりも先にstringの予備知識を付ける ・スコープの意味を理解する これは最低限やっておく事をお勧めする
251 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:20:28 ] わかりました!ありがとうございました
252 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:29:30 ] while(itr != itrEnd){ itr->second = 0; itr++; } 初期化はこんな感じですかね? firstのstringの初期化もいりますか?itr>first="";としたらコンパイルできなかったので・・・
253 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:35:55 ] itr->firstはconstだろが。 なんでそんなことがしたいんだよ!
254 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:39:00 ] >>252 お前は一度STL標準講座の本を買ってきてサンプルプログラムを 全部手で打ち込んで走らせて実行してみろ。 俺はそうやって覚えた。
255 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 00:40:34 ] 252の質問はわすれてください!whileでインクリメントしてたitrをbeginに設定しなおしてなかった・・・
256 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 04:25:30 ] 学習の初期なら、ヘタすりゃ一日100個はつまらん疑問(後から考えれば)が浮かぶもんだが、 その頻度でいちいち書き込まれちゃかなわん。 ていうか、ある疑問を自力で解こうと動く過程で、副作用的に身につく多くの事柄こそが 実質的には学習のメインだと思うんだが(疑問を1つ解決する度に、幾つもの新知識が身につく)、 いちいち質問してたらその一番大事な効能が激減するぞ。
257 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 06:08:33 ] 至言
258 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 07:53:27 ] つか、STL以前の問題ばかりだな
259 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 08:05:31 ] >>240 C では int だけど C++ では char 。
260 名前:240 mailto:sage [2008/10/29(水) 08:55:46 ] >>242 あほ。 文字列リテラルに文字を突っ込む馬鹿じゃねーよ。 勝手に他人認定するな
261 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 10:43:00 ] 考えてみろ、と言われても 何も考えず「あほ」呼ばわりする程度には馬鹿なんですね。
262 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 12:49:34 ] >>261 は何か勘違いをしてないか
263 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 13:28:07 ] あほだし仕方がない
264 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 17:05:21 ] >>258 だからあのときあれほどC++相談室とスレ分けるなと言ったのに・・・
265 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 17:08:29 ] >>264 一緒にしたら荒れて収拾付かなくならなくないか? C++相談室が過疎ってるから丁度いいのかもしれんけど
266 名前:デフォルトの名無しさん mailto:sage [2008/10/29(水) 21:05:44 ] 初心者スレに行くべきだと思う
267 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:12:36 ] リストの中身をAの順で並び替えて、A同士が連続したままになるように Bの順で並び替えるにはどうすればいいの?
268 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:17:32 ] Bでソートした後 Aで安全ソート ってことか?
269 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:52:56 ] >>267 あ1 あ2 あ3 い7 い9 う4 う5 う6 てな感じ?
270 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 22:02:56 ] >>268 安全じゃなくて安定だろ
271 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 00:01:29 ] stable_sort
272 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 07:46:27 ] 期待通りの並てになるまでランダムに入れ替える
273 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 07:54:36 ] きたいどおりのなみて?
274 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:11:40 ] >>272 ほんとにそういうアルゴリズムがあるんだよな 最初見たときギャグかと思ったが ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88
275 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:54:38 ] お前らボゴソートさんをあまりなめない方が良い。
276 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:54:40 ] 勿論、ギャグですが。
277 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 09:48:11 ] イテレータを保持して参照しようとするとエラーが出る erase()はしてない、参照前にpush_back()をした push_back()すると以前のイテレータが無効になるのか?
278 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 09:52:06 ] >>277 無効になるコンテナもある。vectorとかdequeとか。 無効にならないコンテナもある。listとかmapとか。
279 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 12:25:13 ] まさにvector 場所を保持できないので必要なデータをとるときに 最初から検索しなきゃならないので不便だな listに変更する
280 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 12:29:08 ] vectorなら単にインデクスアクセスすりゃいいんじゃね?
281 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 12:58:07 ] インデックスも保持しといたらあてにならんだろう
282 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 13:13:01 ] push_backしかしないならインデックスは変わらんだろ
283 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 15:29:09 ] インデックスはとある理由で禁書されている。
284 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 15:45:12 ] push_backしかしない場合、dequeのイテレータは無効になるが 参照やポインタは無効にならない。 微妙に便利な時もあるかもしれない。
285 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 16:25:56 ] push_backしかしない場合インデックスは変わらないだろうけど 参照とかポインタは変わるだろ
286 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 16:57:59 ] vectorならな dequeだと変わらない
287 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:25:06 ] dequeもメモリ続いてるから、足りなくなったら再確保されてアドレス変わらね?
288 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:48:20 ] > An insert at either end of the deque invalidates all the iterators to the deque, > but has no effect on the validity of references to elements of the deque. 先頭と末尾への挿入は、イテレータは無効にするが要素への参照は無効にしない。
289 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:53:24 ] ↑は規格書の 23.2.1.3 deque modifiers のところね。
290 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:53:27 ] >>287 deque<T>の仕様をとてつもなく乱暴に要約すると、 vector<T*>みたいな構造になってる。 だから拡張されても要素自体のアドレスは変わらない。
291 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 17:55:25 ] ちなみに両端以外への挿入はイテレータも参照も無効になるから注意
292 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 18:37:10 ] >>287 ランダムアクセスできるだけでメモリは続いてないでしょ?
293 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 01:17:19 ] とうとうお前らがdequeのスゴさに気づく時が来た
294 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 01:20:50 ] いや知ってて当たり前のことばかりだから
295 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 01:21:28 ] dequeの使いどころがわからん
296 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 01:29:23 ] 上から取ったり、下から取ったり、南京玉簾のような使い方をする場合、dequeほど使えるコンテナは無いぞ。
297 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 01:49:09 ] 「dequeは結構すげえんだぜ!」 っていうデータをまとめた記事(英語)が以前貼られてたね。
298 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 09:50:07 ] >>295 ・ランダムアクセスしたい ・要素を加えたり抜いたりすることがある そういうときに使う。 vectorでやると要素の追加・削除で領域を連続にするためのコストがかかる。
299 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:40:49 ] listはイテレータを記録すれば、ランダムアクセスできるよね? イテレータが無効になる場合ある?
300 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:48:27 ] つうかイテレータ記録すればどんなコンテナだろうとランダムアクセスできるんじゃね
301 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:57:27 ] 話の焦点が「イテレータを記録するモノ(コンテナなり何なり)」の機能に移るだけだよな、それ。
302 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 14:17:32 ] >299 結局 vector<list<something>::iterator> みたいなのを使うことになって vector が登場する罠
303 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 17:56:00 ] つまり boost::multi_index の話しに
304 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 00:29:30 ] dequeのbuffer sizeってなんぼぐらい? vc7,8は16bytes gcc3.4.4(cygwni)は512bytes vcの16って小さくね? stringなんかはlistと同じになっちゃわないか このサイズを指定できるdequeがほしいんだが boostにあったりするかなあ
305 名前:sage mailto:sage [2008/11/02(日) 02:27:17 ] すみませんです。 listのiteratorって、 要素の追加とか削除とかして要素数が変わってしまっても、 そのまま使える保証はあるんでしょうか? 要素の参照は保証されている思うんですが、iteratorが使えるのか。 VCでは実際動くみたいですが言語仕様的にいかがなものか。 ぜひアドバイスおねがいします。
306 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 02:48:55 ] 保証されている。アドバイスとしては仕様書読め。
307 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 02:51:24 ] 付け加えると削除したイテレータ自体は当然無効になる。
308 名前:sage [2008/11/02(日) 03:15:01 ] 早速の返答ありがとうございます! ブラボーlist!使いやすさ爆発です。 そして以後ちゃんと仕様書読むようにします。 ありがとうございました。m(_ _)m
309 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 10:20:03 ] VC使ってる時点で言語仕様も糞も無いと理解しろ。
310 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 11:41:22 ] VC++6.0の頃じゃないんだから 今は結構まともだよ
311 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 12:10:26 ] VC++2008と仕様書との相違点はそれほど多くない。 書いてないだけで、これ以外にもあるのかもしれないがw msdn.microsoft.com/en-us/library/x84h5b78.aspx
312 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:37:16 ] むしろgccのほーが異端
313 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:45:55 ] それはない
314 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 14:30:28 ] MFC(笑) ATL(笑)
315 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 15:35:16 ] 急にどうした?
316 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 15:45:00 ] dcc最強
317 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 20:53:06 ] ecc最強 翻訳的な意味で
318 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 13:56:24 ] BCCはどうよ C++Builder2009にはBoost標準添付だったが
319 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 14:33:06 ] Boostって行っても1.35、しかもフルセットでなくてサブセットだけどな
320 名前:デフォルトの名無しさん [2008/11/05(水) 11:45:38 ] map<string int> hoge; mapを宣言したとき、intの領域は初期化されているんでしょうか? されていないとしたら、 map<string,int>::iterator itr; map<string,int>::iterator itrEnd; itr = hoge.begin(); itrEnd = hoge.end(); while(itr != itrEnd){ itr->second = 0; itr++; } のように初期化すればいいんですかね?
321 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 11:58:44 ] ちがう
322 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:00:49 ] なんで初期化したいんだろうか
323 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:12:16 ] intのほうでカウントとりたいんです
324 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:33:11 ] map<string int> hoge; だけだと map コンテナの中身は空っぽだから string も int もまだ領域確保されていなくて デフォルト初期化も値初期化もはじまっていない 空のコンテナの begin() と end() は無効な要素を指している 無効な要素に対するアクセスは失敗する itr->second = 0; // やっちゃらめぇ だと思います
325 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:47:23 ] 空のコンテナなら begin() == end() にならないんだっけ? そうなるなら>>320 を走らせちゃってもアクセス違反にはならないが
326 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:51:39 ] >>324 なるほど void func(){ map<string int> hoge; } の関数内で宣言した場合、関数が呼び出される度に 空っぽになるんでしょうか?
327 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:04:07 ] 呼び出される度にbegin()==end()になります
328 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:16:46 ] hoge["str"] ++; とやればちゃんと0から加算されるんですか?
329 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:17:25 ] 空のコンテナのイテレータはbegin()==end()になるって保証は 規格書に書いてあるの?
330 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:18:24 ] >>328 vectorとmapを混同するな
331 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:19:34 ] >>328 規格ではmapにoperator[]を適用した場合もしそのキーが 存在しない時はデフォルトのコンストラクタで初期化される 決まりになってるからint()、つまり0から始まる
332 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:22:43 ] >>329 23.1.7
333 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:25:49 ] >>330 どの辺を混同していますか?
334 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 13:25:53 ] >>332 サンクス これは目から鱗だ
335 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:23:33 ] iteratorの位置を動かすとき ++it とかするけど it+=8 のような感じで8個分移動する方法はないの?
336 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:26:55 ] >>335 advance
337 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:27:32 ] もちろん、ランダムアクセス可能なイテレータはit += 8で平気。
338 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:36:44 ] listなのでループで回すしかないか あと、ある値を持つコンテナを検索する関数を作ったのだが 見つからなかった場合NULLを返そう思ったら itにNULL代入できない。しかも it ==0とか演算も不可 このような場合みんなはどうしてるん?
339 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:40:21 ] >>338 end返すのはいやなのか?
340 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 20:47:32 ] thx、打開した
341 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:25:09 ] そもそもfindでいいんじゃね
342 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:28:59 ] stlportのhash_mapにお尻から回す奴はないですか?
343 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:33:23 ] イチジク浣腸はどうだ
344 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:53:29 ] rbegin() rend()
345 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:22 ] 叙述関数には引数わたせないの? find_if( List.begin(), List.end(), compare( 引数1 、 引数2 ) );
346 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:56:09 ] ファンクタを使えばいくらでも。
347 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 16:02:53 ] >>342 vcのstdext::hash_mapならreverse_iteratorがあるぞ
348 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:51:20 ] VC2008とSTLpらすか5.1.7ですけど _STLP_USE_STATIC_LIBを指定すると ↓と言われてリンクできません。 ファイル 'stlportstld_statix.5.1.lib' を開くことができません。 stlportstld_static.5.1.libならあるんですけど。バグですか?
349 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:02:22 ] ren stlportstld_static.5.1.lib stlportstld_statix.5.1.lib
350 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:12:47 ] #define _STLP_NEW_PLATFORM_SDK 1
351 名前:デフォルトの名無しさん [2008/11/08(土) 12:18:23 ] VB6からVC++2005にプログラムを移植してるんですが、 下記の処理がVB版に比べてVC++版では50倍ほど時間がかかりました。 1から順に使われていないID番号を探すアルゴリズムで、内容は全く同じですが、なぜでしょうか? m_itemは構造体配列で、要素数は600個程度です。 VC++のstd::vectorの実装はクソすぎなんでしょうか? ■VBの処理 Dim i As Long, j As Long For i = 1 To 65535 For j = 0 To m_item_num - 1 If m_item(j).id = i Then Exit For Next If j = m_item_num Then get_new_item_id = i Exit Function End If Next ■VC++の処理 size_t i, j; for( i= 1; i< 0xFFFF; i++ ){ for( j= 0; j< m_item.size(); j++ ) if( m_item[j].id == i ) break; if( j == m_item.size() ) return i; }
352 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:36:59 ] >>351 const size = m_item.size(); for(j = 0; j < size; ... キミのままだと、jのループ後とにm_item.size()関数が評価される。
353 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:47:16 ] VC2005だとm_item[j]が毎回範囲チェックされてる vector使う前に #define _SECURE_SCL 0を入れると良い感じらしい あと、まさかとは思うけどDebug版じゃなくて Release版で実行してないとかはないよね?
354 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:58:48 ] そもそもループを1重に直したら(VBでもC++でも)もっと速くなると思う。
355 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:59:39 ] setでも使えばいいのに、とも思った
356 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 13:01:24 ] VBは知らないけど、C++のただの配列とvectorとでも50倍も差はないから、なんか他の要因で遅くなってると思われ。
357 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 13:02:15 ] あーごめんそれは無理か
358 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:00:46 ] 終了条件おかしくないか?
359 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:07:46 ] 351ですが、 >>352 が主な原因だったようです。>>353 でも多少改善しました。 二重ループをやめて、qsort()でもしてから一重ループで探すというのもいいかもしれませんが、 アルゴリズムを変更しないとVBより遅くなるというのは腑に落ちませんね。 ベクターは使い方次第でパフォーマンスに劇的に影響するようで、なんか怖いです。
360 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:24:53 ] VC2008のvectorで if (int i = 0; i < tbl.size(); i++) tbl[i] ・・・ みたいな使い方と、 配列で、 if (int i = 0; i < TBL_SIZE; i++) tbl[i] ・・・ みたいな使い方をした場合、 Debugビルドで最適化なしだと数十倍の差で、Releaseビルドで、最適化ありだと、二倍程度の差だった。
361 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:26:01 ] このスレ的にはiterator使おうぜ
362 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:31:04 ] >>359 VB知らないんだけど、この場合のm_item_numってなに? それ次第では、そもそも「内容は全く同じ」という認識が間違ってたことに。
363 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:35:47 ] VBとコードが違わないか? >for( i= 1; i< 0xFFFF; i++ ){ for( i= 1; i<= 0xFFFF; i++ ){ 調べてる要素が違ってるなら50倍違ってもおかしくはないけど。 あとは計測時間が短すぎて時間を計ってるタイマーの精度の違いが出てるとか とりあえず>>351 のコードをReleaseビルド&_SECURE_SCLでコンパイルしてVBより50倍も遅いなんてことあり得ないだろ。
364 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 14:53:51 ] >359 ちゃんと最適化かけたか?
365 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:06:10 ] STLがVBに負けるなんて悔しい ビクンビクン
366 名前:351 mailto:sage [2008/11/08(土) 15:08:04 ] すみません。デバッグビルドになってたようです>< なんかデバッグなしにしたり最適化とかするとエラーが出てコンパイルできなかったので、何となく諦めてました。 >>359 をやった上で最適化まですると、VBより速くなりました。 めでたしめでたし。
367 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:10:02 ] しね
368 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:12:42 ] まさにVB脳
369 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:14:42 ] 二重ループのかわりにstd::find_ifを使ってみようぜ! あと上で言ってる人もいるけどsortするならむしろstd::vectorのかわりにstd::setを使おうぜ Itemがidをもつぐらいなら用途にあってる可能性高いし
370 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:20:36 ] VBでもデータ構造を変えれば劇的に速くなるな。
371 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:27:41 ] >>369 ちょっとよく分かりませんが、勉強してみます。 今はVBのコードをC++にツラツラ置き換える作業だけをやってます。 VBの配列 → std::vector VBのString → std::string という置き換えで、今のところこれ以上のSTLの知識はありません。 アルゴリズムを下手に変えると、新たにバグが混入することになるので。
372 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:33:36 ] VB6と一緒に心中してくれよ。こっちくんな。
373 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:40:28 ] 移植させてもらえるだけでも素晴らしいことだと思わないか。
374 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 15:44:24 ] つうか既にバグ混入しててワロタ >for( i= 1; i< 0xFFFF; i++ ){
375 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 16:03:45 ] findを使って作ってみました enum { N = 600, ID_MAX = 0xffff }; template<typename ID> struct Compare { Compare(ID i) : m_i(i) {} template<typename T> bool operator()(T const& i) { return i.id == m_i; } private: ID m_i; }; template<typename ID, typename Container> ID find_uniq_id(Container const& m) { typename Container::const_iterator m_end = m.end(); for (ID new_id = 1; new_id <= ID_MAX; ++new_id) { if (std::find_if(m.begin(), m.end(), Compare<ID>(new_id)) == m_end) return new_id; } throw std::domain_error("new_id must not be beyond ID_MAX"); }
376 名前:375 mailto:sage [2008/11/08(土) 17:05:13 ] id_typeとget_idを特殊化することによってより流用できるようにしてみました 参照の参照が怖いのと面倒臭いのが難点だと思いました template<typename T> struct id_type { typedef typename T::id_t type; }; template<typename T> typename id_type<T>::type get_id(T const& x) { return x.id; } template<typename T> struct Comparator { typedef typename id_type<T>::type ID; typedef bool result_type; Comparator(ID i) : m_i(i) {} bool operator()(T const& i) const { return get_id<T>(i) == m_i; } private: ID m_i; }; template<typename ID, typename Container> ID find_uniq_id(Container const& m) { typename Container::const_iterator m_end = m.end(); for (ID new_id = 1; new_id <= ID_MAX; ++new_id) { if (std::find_if(m.begin(), m.end() , Comparator<typename Container::value_type>(new_id)) == m_end) return new_id; } throw std::domain_error("new_id must not be beyond ID_MAX"); }
377 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 17:39:34 ] これはひどい
378 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 18:08:48 ] なんというオナニー
379 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:37:20 ] 数値を文字列にするには ostringstream を使用する方法がメジャー?
380 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:39:59 ] >>379 たぶん sprintf を使う人のほうが多い。 snprintf が C++ 標準に入ればさらに増えるかもしれない。 結果を string で使うことや安全性を考えれば ostringstream のほうが良いとは思うけど。
381 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:54:15 ] sprintfはchar確保するの面倒だとおもうけど 利用者が多いのは何か理由があるの?
382 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:55:45 ] >>381 C からの移行組。
383 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:10:24 ] Exceptional C++ Style でstringstreamはsprintfに比べて だいたい10倍くらい遅いと書かれていた。
384 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:30:02 ] 速度的な点もあるけど printf系というのは非常に多くの言語で(Win32にはAPIもある)用意されていて 細部の違いはともかく、知っている人が多い、使い方を覚えて無駄にならない、 というのもある。 C++だけの世界だけで見れば型安全性の無さ等非難される面も多いし 「C++らしくない」という良くわからない理由で嫌う人も。 また、(よく知らない人に多いが)セキュリティ等の面で問題があると言い張る人も居る。
385 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:54:57 ] 書式の設定がめんどくさい上に、長くなってしまう気がするんだが俺の書き方悪いのかな
386 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:07:58 ] >>385 stream のことなら、たぶんそんなもん。 そういえば C++0x でもこの点は特に改善されたような話を聞かないな。 boost の io state saver ぐらいは入ってもよさそうなもんだと思うけど。
387 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:57:41 ] >>379 boost::lexical_cast を使うがよい 結局 stringstream 使ってるんだけどな
388 名前:デフォルトの名無しさん [2008/11/09(日) 11:53:14 ] >>381 char確保しなくてもいいよ。 std::string str; int a = 123; str.resize(256,0); sprintf((char*)str.c_str(), "%d", a); str = str.substr(0, str.find('\0'));
389 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:04:57 ] stringにconst_castか…
390 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:06:07 ] c_strの間違いw
391 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:23:41 ] >>388 c_str() の戻り値に無理やり書き込んでも反映されるとは限らんよ っていうかconst外して書き込むなんて無茶苦茶にもほどがある
392 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:24:08 ] #include <vector> #include <cstdio> #include <iostream> int main(int, char *[]) { std::vector<char> buf(0xff, 0); int n=10000; std::sprintf(&buf.front(), "%d", n); std::cout << static_cast<const char*>(&buf.front()) << std::endl; return 0; } なるへそ
393 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:27:03 ] printf系はセキュリティ面で問題あると思ってたが 問題ないの?
394 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:29:46 ] const外し か、漢だ!
395 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:30:56 ] nの型がintでlog10(n)が100や200にもなるアーキテクチャがあれば教えて欲しいものだ
396 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:41:02 ] string使おうがvector使おうが スタック上に領域確保してれば char配列となんら変わらん
397 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:46:24 ] >>396 大概はそうだが、規格には反するな
398 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:07:49 ] >>393 使い方の問題。 ユーザー入力をフォーマット文字列に使おうとする大バカと 最大文字数の指定方法を知らないバカがそう言ってるだけ。
399 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:32 ] >>398 具体的に何の関数を言ってるかわからんけど、 すくなくともsprintfはあぶない
400 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:28:49 ] 一般的にやるべきでないとされていることを「だって出来るじゃん」の一言でやってしまう・・・ くせぇーっ! DQN以下の臭いがぷんぷんしやがるぜぇーっ!
401 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:31:44 ] >>399 具体的にどこが危ないのか教えてよ 「使い方を間違えたら危ない」というレベルの話なら 「listen()を使う全てのプログラムは危ない」というのと同じになっちゃうから
402 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:39:40 ] >>401 え?最大文字数を指定できないじゃん それが危険だと思えないならまぁ好きにするといいよ
403 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:42:38 ] sprintfで100byteのバッファしか取っていないのに、 100文字以上有るかもしれないユーザ入力を与えるとかね。
404 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:44:11 ] VCのsprintf_s使ってます(^^)
405 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:46:22 ] ハア? char buff[100] sprintf(buff, "%.80s", user_input); これのどこが危ないって?
406 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:47:28 ] まさしく>>398 の最下行に書いてあるバカが言ってるとしか思えないんですけど。
407 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:48:08 ] C++ で何で sprintf なんて使ってるのん? しかも STL スレで・・・。 ostringstream か boost::format を使っとけ。
408 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:00:20 ] >>405 そういうことを分かって使う分にはいいけど、 実際に使う人間が必ずしも分かっているとは限らないし、 分かっていても、うっかりやってしまう危険性があるよね。
409 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:04:25 ] つうかそんな単純なケースならいいけど、 色々出力したりロケールが絡むと出力結果の予想がしんどいだろ
410 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:08:01 ] そんなレベルなら、「vectorで[]は使わないほうが良い。at()を使え。」と同じじゃないの。 特に>>399 はわざわざ>>398 に対して言ってるんだから もっとちゃんとした危険性を指摘してくれても良さそうなもんだけど。 そりゃ、切捨て前提という仕様は良くないとか 全部生かすつもりならsnprintfの方が楽だとか言うのはその通りだけど それとセキュリティ的な問題は全く別だから。 柔軟性だって例えば std::vecotr<char> buff; buff.resize(???); sprintf(&buff[0], "%.*s", buff.size()-1, str); のような使い方である程度確保できるし。 >>409 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。
411 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:13:43 ] >>410 > 「使いやすさ」と「セキュリティ的に問題」は全く別の話なんですけど。 この一行が>>409 の話とは全く別の話なのは、そういうジョークなの?
412 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:33 ] ostreamが状態を持ってるのもしんどい
413 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:14:53 ] あ、別にユーザー文字列をそのまま配列に落とす場合に限らないよ。 そもそも(1箇所での)ユーザー入力なんて、普通は1つなんだから 例えば sprintf(filename, "file-%.80s%d.dat", input, num); のような形式でも、充分に最大値は予想できるし。 あ、「intが512bitの環境を考慮すると面倒」というのはその通りか。
414 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:17:55 ] 使い難さが有るということは、ミスり易いってことじゃね? ミスってもセキュリティ的な問題が出ないライブラリならいいんだけど。
415 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:19:43 ] いわゆる、バグというものは、ミスることによって起こるんだから。 十分予想出来るとかで大丈夫じゃないか、なんていい方出来るだったら、 世の中の全てのソフトウェアにはバグが無いってことも言えてしまう。
416 名前:409 mailto:sage [2008/11/09(日) 14:19:58 ] >>410 いやだから 出力結果の予想が困難→バッファ長の予想が困難 セキュリティ的にあぶなくね? という話し 気をつけて使え って話しなら そうですね としか言えないけど みなミスりがちだからsnprintfとかVC++のセキュア関数とか あるんじゃないの?
417 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:32:40 ] いやだから 全然>>398 への反論になってない。 「使い方を知らないのが問題」なだけでは 「セキュリティ的に問題がある」ということにはならないから。 まあ、416の言いたいことはもっともだし 他にもっと良い選択肢があるならそちらを使うべきなのは確か。 でも残念ながら標準ではない。 ただ、自分が「使い方を知らないバカ」だという自己紹介はもういいよ。 >>398 の最下行を無視して>>402 と反論するような人が>>399 みたいに書くわけだから。
418 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:35:28 ] あ、それと、「最大値の見積もりを間違える」点についてだけど 別に用意したバッファの95%以上まで使わなければいけない、というような決まりはないから。 多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。 例えば>>405 のようにね。
419 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:37:36 ] >多少(例えば末端の'\0'とか)の計算ミスがあっても充分すぎるように見積もって置けばよい。 ええええー
420 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:38:20 ] 最大量がきっちり分かってる状況じゃないかそれでいけるのは
421 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:41:24 ] は? 当然過ぎて困りますが ユーザー入力の部分の最大量は>>405 のように制限して その上で他の部分の見積もりが多少違っていても大丈夫なように ということですけど。
422 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:42:37 ] ユーザー入力の部分の最大値を制限するのは 当然というか大前提だと思っていましたが、皆さんは違うのですか。 認識の違いですね。
423 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:44:22 ] つまり、%fは使うなってことですね、判ります。
424 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:48:54 ] あー、sprintfは使い方が難しくセキュリティ的な問題を起こしやすいので使うべきではない。 とすると、 同じように、 使い方が難しくセキュリティ的な問題を起こしやすいものは使うべきではない ということになりますね。 つまり、 C++をやめましょう、と。 Javaあたりがよろしいでしょうか。 実際、世間の潮流もそういう流れになってますしね。
425 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:49:50 ] >>423 %.fを使ってください
426 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 14:52:52 ] >>425 sprintf(buf, "%10.0f", 1e100);
427 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:02:23 ] snprintf()なら、 snprintf(s, sizeof(s), … ってやっとけば安全だけど、 sprintf()は人間が数えないといけないじゃん。 >>405 見たいな単純なやつだったらどっちでもいいってことになるかもしれんけど、 書式が複雑になってくると、ミスる可能性がでてくるよ。 てか単純にsnprintf()のほうが楽ジャン。sprintf()で人間がバッファサイズ数えるなんて非合理。
428 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:04:36 ] いつまで STL スレで sprintf の話をやってんだよ。 そんな型安全じゃない C の糞遺物なんぞ C++ で使うな。
429 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:05:04 ] だよな!
430 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:32 ] >>426 printf("%.2u", -1); の時に必ず2桁に収まると思う人は居ませんね。 これと同様に最大桁数が見積もれる点は変わらないと思いますが。 いや、最大桁数はbit数に依存するので環境依存ですけど。 >>427 だからsnprintfはC++においては非標準だって。 それに「sprintfはセキュリティ的に問題がある」という意味にはならないよ。 「C++はセキュリティ的に問題がある」というのと同様。
431 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:07:47 ] ところで型安全って何ですか?
432 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:10:57 ] snprintfってC99からなんだっけ… 0xでは標準になるのかなぁ
433 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:12:10 ] なりません
434 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:13:40 ] 相変わらず話題の質が下がると賑わうな。
435 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:20:11 ] >>432 ドラフト N2798 の 17.1 [library.general] p9 より > This library also makes available the facilities of the C99 standard library, > suitably adjusted to ensure static type safety.
436 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:23:46 ] _scprintfで数えたらいい
437 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:28:25 ] >>430 doubleの最大桁数を常に見込んでバッファを確保するとでも? %fを使わずに、素直に%gを使えば済むじゃん。 そういう使いこなしを必要とするからsprintf()は難しいと言うなら判るが、 使いこなしてもいないのに語ろうとするな。
438 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:33:24 ] 結論:ostrstream or boost::lexical_cast or boost::format or boost::egg::to_string
439 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:00:48 ] 結論:いままで聞いた話を総合すると、一番スマートなのはこれ。 std::string str; int a = 123; str.resize(12); sprintf_s((char*)str.c_str(), str.size()-1, "%d", a); str.resize(str.find('\0')); ストリームとかで中間バッファを使うのはメモリの無駄だし、sprintfの書式指定能力の高さは最強。
440 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:02:21 ] >>439 その場合だとstr.size()は0が返るよ。 あと規格は大切にね。
441 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:03:16 ] >>その場合だとstr.size()は0が返るよ。 ごめん勘違いした。 でもその書き方は受け入れられない。
442 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:05:42 ] c_str()を出力バッファに使う男の人って
443 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:06:48 ] もはやSTLじゃねーなw
444 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:13:28 ] vectorを使えばかろうじてSTLに関する話題の範疇に入…らないか
445 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:17:17 ] >>439 × (char*)str.c_str() ○ &str[0] あと、せっかくだから sprintf_s() の戻り値使えよ。
446 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:30:07 ] >>445 規格ではstd::stringのメモリ上の連続性は保証されていない。 std::vectorと混同するな
447 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:33:39 ] どうせ大丈夫なんだから別に良いじゃん
448 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:35:47 ] 仕事で一緒にならないなら別にいいよ
449 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:38:17 ] >>446 C++0x で連続性は保証されるようになるし、 現状のどの実装でも連続性は成り立っている。
450 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:41:45 ] >>446 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#530 まぁ現時点で保証が無いというのは確かなんだけどね。
451 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:38:58 ] size_t count = _sctprintf(_T("%d"), 777) + 1; std::vector<TCHAR> buffer(count); _stprintf_s(&buffer[0], count, _T("%d"), 777);
452 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 17:52:09 ] TCHAR(笑)
453 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:42:07 ] >>449 そういう話をしたいのなら実装依存スレへ逝け
454 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:43:16 ] >>451 そういう話をしたいのなら実装依存スレへ逝け
455 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:54:23 ] STLのlistを利用したプログラムを実行中、 "list iterators incompatible" という例外が発生しました。これはどういったエラーでしょうか? 開発環境はVisualStudio2005 AcademicEditionです。
456 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:01:13 ] ソース晒せ
457 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:06:15 ] transformの使い方に関して質問があります。環境はGCCです。 目的は、stringの中身をすべて小文字に変換したいのです。 #include <string> #include <algorithm> #include <cctype> #include <cstdio> #include <iostream> string aa = "AbCdEfG"; transform(aa.begin(),aa.end(),aa.begin(),tolower) で、aaの中身をすべて小文字に変換できません。 理由はわかりますでしょうか?
458 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:10:50 ] >>457 とりあえずコンパイルエラーだろ。 エラーの意味がわからんということならエラーメッセージ晒せ。
459 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:14:20 ] 俺の環境では全部小文字になるが・・・。
460 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:20:44 ] 使用したソース #include <string> #include <algorithm> #include <cctype> #include <cstdio> #include <iostream> using namespace std; int main(){ string aa = "AbCdEfG"; transform(aa.begin(),aa.end(),aa.begin(),tolower); } 以下がコンパイルエラー test.cpp: In function 'int main()': test.cpp:9: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits\ <char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> \ > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded f\ unction type>)' よろしくどうぞおねがいします。
461 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:23:26 ] >456 ttp://www.hsjp.net/upload/src/up51891.txt 本来の拡張子は.hppです。ごちゃごちゃしててすみません。 103行目のupdate_etc()関数が怪しいと思っているのですが…
462 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:24:53 ] Effective STL に乗ってたネタかな
463 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:32:13 ] >>457 たぶん、こういう関数オブジェクトを作ってそれを渡せばいいよ。 struct my_tolower : std::unary_function<char, char> { char operator ()(char c) const { return std::tolower(c); } };
464 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:54:01 ] transform(aa.begin(), aa.end(), aa.begin(), static_cast<int(*)(int)>(tolower)); 通った typeof(aa)::value_type : char tolower : int(*)(int) でtolowerをchar(*)(char)と型推論しようとして失敗してる なので正確にキャストして与えてやればおk?
465 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 20:57:12 ] >>461 まずはデバッガのバックトレースを見たりブレークポイントつかったりしてあたりつければいいよ segvだろうが、unhandled exceptionだろうがどこで発生したか分かるから
466 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:00:18 ] >>464 >>460 の最後の行の中にunresolved overloaded function typeってのがあるでしょ。 C++では、tolowerが多重定義されているのだが、 それではテンプレート引数の型が決定できないということでエラーになる。 だから、>>464 のようにキャストが必要になる。>>463 みたいに他の方法も考えられる。
467 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:06:27 ] >>466 >>464 >>460 ありがとうございます。 なるほどよく分かりました!
468 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:21:38 ] >465 ありがとうございます。とりあえずどこで投げてるのか絞り込んでみます。 ただ、list iterators incompatibleというのがどういう状態を指すのか、よくわからないのです。
469 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:37:51 ] vcのstlのincludeディレクトリにて"list iterators incompatible"で全文検索するとか
470 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 22:01:54 ] >469 そういう方法もあるのですね listの中を覗いてみます。 ありがとうございます
471 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 11:38:03 ] dequeにpush_backで要素を挿入していくのは、予め配列をサイズ決め打ちで宣言して代入していくのより遅いですか?
472 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:13:18 ] >>471 速度は実測が基本。 一般的に、 push_back() を繰り返す場合、配列要素のメモリ確保回数が増えるので 遅くなる可能性が高くて、それでも push_back() ならコピーコンストラクタが使われるので 要素の型によっては代入に比べて速い可能性もある。
473 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 20:00:12 ] 気になるけど図るのが面倒臭いなら、reserveしておけば精神的に気が和らぐ。
474 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:12:15 ] vectorならreserveは必須だと思う dequeってどうだろう
475 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 22:21:59 ] dequeはある一定の長さのブロックが不連続に確保されるそうだから reserveしたらシステムからメモリを持ってくる時間は稼げるけどvector と違ってメモリの再配置は起きにくいんだよね
476 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:24:27 ] それは実装によるんでは。
477 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 23:32:37 ] 実装によるのはもちろんだが一般的な実装の話ね
478 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 01:13:27 ] dequeのpush_backが(償却じゃなくて正真正銘の)定数時間であることは規格で要求されてたはず だから一概に実装に依るとも言えない
479 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 07:48:57 ] dequeはpush_back/push_frontで既存要素のコピーが起こりえないのがありがたい まあ最初から要素数が判ってるならvector一択だけど
480 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:37:08 ] STLのことは良く分からないけど、 list,stack,queue,vector,dequeで空のクラスSampleのポインタを、 10万個格納、(1個delete&削除・1個格納)*10万回、 空になるまでdelete&要素削除 してみた。 vectorは予め追加要素の2倍reserve()した。 要素の追加削除はvector,stack以外『古い物から削除』、前から取り出して後ろから追加でやった。 stack、queueはそれぞれコンテナdequeを利用。 list 68.11 秒 vector 20.344 秒 stack 27.5 秒 deque 9.468 秒 queue 9.438 秒 queueが速すぎてワロタ dequeは操作する方向次第でstackとほぼ同等 queue,stack,dequeはこの場合、実質同じモノだし queue,stackのコンテナを変えたら悲惨な結果になった PCが悲鳴を上げたのでこれ以上のテスト回数は勘弁
481 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:41:18 ] あぁ、次はboost::circular_bufferだ…
482 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 20:58:12 ] >481 >480と同条件、上限20万個として計測してみた。 平均5.5秒くらいだった
483 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:21:57 ] ひょっとしてlistってあんまり使わない方が良い?
484 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 23:51:07 ] むしろ連結リストのくせに良い数字が出てると思うがね
485 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:18:06 ] リンクリストより配列のほうがキャッシュに引っかかりやすいからいいぞってMSも言いている。 msdn.microsoft.com/ja-jp/library/eye126ky.aspx
486 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:33:54 ] >>483 状況次第 listのほうが向いてる使い方もあるしね
487 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:54:30 ] 途中(先頭末尾以外)の要素の削除はlistじゃないとやってられんやろー
488 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 00:55:31 ] あとリストの連結やリストの分割もあるか あれ?そんなことできたっけ・・・?
489 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:01:03 ] とりあえずただデータを突っ込んで置きたい(出し入れ順番とかどうでも良い)場合には、 リストは不向きってことか
490 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:14:52 ] 昔はやたらとリンクリストを使うのがいいとされていたが、 今のご時世でも初心者にリンクリストを教えたがる間抜けが後を絶たない。 普通にstd::vectorを使えるように仕込んでおけば、std::listを使うのも苦労はないだろうに。
491 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 01:15:39 ] >>487 途中の削除もdequeは結構速い。 listは削除してもイテレータが無効にならないのが利点かな。
492 名前:1/2 mailto:sage [2008/11/14(金) 15:46:52 ] listを使っていてよく分からない事態に遭遇したので質問します。 長くなってしまったので申し訳ありませんが分割投稿します。 環境:VC++2005 / XP typedef struct globalArray { int type; char name[100]; float variable[5][5]; } globalVar; typedef struct nodeDat { CShaderNode *nodeKind; globalVar varDat[5]; // 上の構造体(globalVar) int dataNum; float power; } nodeData; typedef struct _data { nodeData mainNode; // 上の構造体(nodeData) nodeData blendNode; // 上の構造体(nodeData) nodeData subNode; // 上の構造体(nodeData) int materialNum; dxMaterial *matrials[MAX_MATNUMBER]; } dataBlock;
493 名前:2/2 mailto:sage [2008/11/14(金) 15:47:25 ] 上のような構造体が有りまして、一番下のdataBlockをリストとして扱っているのですが、 dataBlock tmp; /* 〜 データ作成処理 〜 */ /* 〜 挿入先探索 〜 */ insert(itr,tmp); とデータを挿入してリストを覗くと途中までしか正しくデータが入っていません。 データ作成過程で"",NULL,0.0fと全て初期値を用いてデータを初期化しているのですが、 data[0]->mainNode.varDat[0].variable 以降のデータが未初期化のまま生成されています。 構造体を入れ子にする前は正しく動いていたのですが、 listを扱う際は構造体を入れ子で扱うとNG等の制約があるのでしょうか。 ご教授お願いいたします。
494 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 15:53:19 ] それだけだと推測しかできん ・初期化の部分が不完全か ・未初期化というのが勘違いか ・リスト操作がバグってるか のいずれかしかないが、心当たりがないなら何か見逃してるんだろう そのようなNG的制約は無いので大丈夫
495 名前:492 mailto:sage [2008/11/14(金) 16:04:13 ] 返信ありがとう御座います。 (※(int)はキャストではなく型を説明上明示するために便宜的につけた物です。紛らわしくてすみません。) 例えば仮データ(tmp)で、 (int)materialNumを0で初期化したのがリストのデータでは (int)materialNumが-33686019になってしまっているので、 >・リスト操作がバグってる のでしょうかね…… ありがとうございます。制約は無いときいて安心しました。 もう少し追ってみます。
496 名前:492 mailto:sage [2008/11/14(金) 16:30:43 ] 連投失礼いたします。 色々弄ってみたところ、構造体のメンバの記述順を入れ替えると正確に入るデータと入らないデータが出てきました。 詳しく調べたところ、連結しようとしている構造体は180byteで、リストで正しく入るのは96byteの領域まででした。 数字的にこれって多分仕様ですよねぇ……
497 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 18:55:54 ] -33686019ってことは0xfdだろ? ちゃんとdeep-copyせんと。
498 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 19:59:55 ] dataBlock tmpA; /* 〜 データ作成処理 〜 */ dataBlock tmpB; tmpB = tmpA; ってやって、tmpAとtmpBは同じ内容の独立したオブジェクトになる?
499 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 20:04:28 ] 誰にもわかりません
500 名前:492 mailto:sage [2008/11/14(金) 21:01:27 ] 返信ありがとう御座います。 >>498 さんのを実行してみたところ、同内容の独立したオブジェクトに成りました。 deep-copyなのですが、 /* 〜データ作成処理〜 */ を抜けた後、tmpに全ての値がきちんと入っていることを確認し、 data.insert(itr,tmp); でインサートを行っているのですがコピーに関してはlist側で処理されている様で、 こちら側からコピー処理を定義することが出来るのでしょうか。
501 名前:デフォルトの名無しさん mailto:sage [2008/11/14(金) 21:50:22 ] >>500 コピー演算子をオーバーロード。
502 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 00:35:09 ] その場合はコピーコンストラクタじゃ?
503 名前:492 mailto:sage [2008/11/15(土) 01:20:38 ] すみません、何かもう全く関係ないところが原因っぽいです。 構造体のメモリ領域と他のクラスのメモリ領域が被ってる……
504 名前:デフォルトの名無しさん [2008/11/15(土) 03:13:32 ] あるIDを割り当てるクラスを作成しようと思っています インターフェースとしてはこんなかんじで class IDAllocator{ uint32_t T AllocID(); void FreeID(uint32_t id); }; クライアントコードに対して、一意なIDを割り当てるのですが、 IDを使い終わった後は返却し、後ほど再利用できる様にしたいです。 IDを割り当てる際に、現在使われてないIDの内、最小の数値のIDを返す仕様にしたいのですが、 STL的にかっちょいい実装方法を教えてください 今のところ割り当て済みのIDをvectorに記録しておいて、0から1ずつ増やしてvectorに無いIDがあれば それを使うというどう考えても効率の悪いやり方でやっています
505 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:44:37 ] 使い終わって返却されたIDをpriority_queueに記録し、再利用するときはそこから取り出す
506 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 03:48:12 ] priority_queueが空なら新たに生成する→新しいIDは最も大きい数値になる ってことか
507 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:29:56 ] インテレータの有効性をチェックする方法はない? 何も代入されてないときなど、別の変数でフラグ保持するのは面倒だと思うので
508 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 09:59:37 ] とりあえずend()でも入れとけとか、 有効/無効状態をチェックするなとか、 そもそもインテレータって何とか。
509 名前:デフォルトの名無しさん mailto:sage [2008/11/15(土) 14:38:28 ] そんなあなたにboost::optional
510 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:05:27 ] >488 splice 使えばできるはず。
511 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:53:37 ] これっておかしくない? ttp://www.geocities.jp/ky_webid/cpp/library/008.html
512 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 01:57:21 ] >>511 どこがどうおかしいと思うのか書けやカス
513 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 11:21:20 ] とりあえずテンプレートクラスはクラステンプレート
514 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:11:13 ] enumの値か?
515 名前:デフォルトの名無しさん [2008/11/16(日) 12:14:51 ] それは別に間違ってなくね
516 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:16:41 ] MIRROR_X
517 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:24:52 ] 問題ないだろ MIRROR_X = SCALE | ROTATE を意図して書いてあるならな。
518 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:35:10 ] はー?
519 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:50:45 ] enum bitset 二大不要物(笑)
520 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 12:54:39 ] enumを不要とか言うやつは素人
521 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:04:54 ] enum要らないとか言う奴はただのバカかTMPしない人だろ
522 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:08:23 ] >C言語であれば、ANDやOR等の演算を使って管理しますが、C++ではbitsetが利用できます。 この辺りで馬鹿を晒している。このサイトも勿論、私のダメサイトリストに載っている。
523 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:10:34 ] じゃぁbitsetってなんに使うの?
524 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:13:37 ] ビット単位のフラグの管理をせざるを得ないときに使うかなぁ。ま、そのときが来たら考えるよ。
525 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:16:23 ] >>522 上級者のあなたがおすすめするサイトを教えてください
526 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:20:55 ] >>523 >>519
527 名前:522 mailto:sage [2008/11/16(日) 13:23:15 ] 残念ながら今のところ、初心者に安心してお勧めでキルサイトは見つけていない。 したがって、申し訳ないが期待には応えられない。 ちなみに、私のダメサイトリストは正しくは、「初心者にはお勧めできない(≒ダメ)サイトリスト」だ。 中級者辺りが読む分には、(自力で確認できるノウハウもあるだろうから)まぁ、悪くないかもしれない。
528 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:34:14 ] enumは型安全じゃないのが気に要らないな
529 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:35:07 ] C++のenumは、|=するだけでキャストが必要な糞仕様
530 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:44:26 ] 俺は#define派 enumだとアセンブラソースから使えないから
531 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 13:54:37 ] >>529 そもそもビットフラグで使うとは限らないわけで…
532 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 14:08:21 ] >>519 unionに失礼だろw
533 名前:デフォルトの名無しさん mailto:sage [2008/11/16(日) 16:05:41 ] それは128ビットとかに使うぞ
534 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 09:37:02 ] お前らみんな、unionさんに謝れ!
535 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:37:45 ] アマチュアの俺からすると分からんのだけど、unionって実際の業務で使われてるの? enumなんかは割りと使ってるんだけど
536 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 15:48:34 ] >>535 使うこともあるよ。Cでbitsetもどきを実装するときとか。
537 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 17:54:37 ] 大きな数値から上位ビットと下位ビット分けたり
538 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:04:00 ] ・建前 unionは環境に激しく依存するから、使わない方がいい。 ・本音 いまどきビッグエンディアンとか無いだろw
539 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:11:15 ] オレも、エンディアン、ビット幅、signedの右シフト、除算の符号は実装決めうちで作ってる
540 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:14:14 ] >>538 サーバ系では未だにSunが頑張っているから無視できないのよね。
541 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:33:05 ] うにおんは組み込みCで以前使ってた事がある おそらく今でも使ってる
542 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:45:55 ] 1の補数はもう絶滅でいいだろ
543 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:50:13 ] 引き算どうすんだよw
544 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 18:59:06 ] 負数の表現方法のことだろ。
545 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:17:14 ] それは2の補数
546 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 19:19:57 ] ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE
547 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 22:16:38 ] よその言語だとASCIIにIEEE754も決め打ちと化しているものもあるよな。
548 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:10:13 ] 未だにIBMのサーバでEBCDICとかあるから油断できない
549 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:51:08 ] >>538 俺はエンディアン入れ替えたいからunion使ってる。 union { double a; char b[8]; }
550 名前:デフォルトの名無しさん mailto:sage [2008/11/17(月) 23:54:30 ] つーかネットワークバイトオーダはbigだし 画像処理でもエンディアン入れ替えなんてよくやるでしょ 全部littleで済むと思ってる人ってどういう世界に生きてるんだ?
551 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:08:27 ] 意識する場面なんてほとんどないな
552 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:11:46 ] >>550 そういうときに、必ずエンディアン変換を挟むコードを書いてしまう(あるいは書かない) というのがエンディアン決め打ちのコーディングだと思う。
553 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:14:19 ] #ifdefるだろjk
554 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:41:30 ] いや、自動判断する。 例えばtiffはヘッダのIかMかで判断できるし、実行環境がどっちなのかはint foo = 0とでもして& fooをchar *にキャストして取り出せば判る。
555 名前:554 mailto:sage [2008/11/18(火) 00:51:28 ] s/int foo = 0/int foo = 1/ まぁ、unionは使わないけれど。
556 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:53:15 ] スレから脱線するが、標準の方法でエンディアンをコンパイル時に知る方法ってある? 実行時ならできるんだが
557 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 00:58:32 ] boost/detail/endian.hppとかを見る限り、標準では無さそうだね
558 名前:デフォルトの名無しさん mailto:わざとだが sage [2008/11/18(火) 01:50:26 ] >>556 コンパイル環境のエンディアンを? それとも、ターゲット環境?
559 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 01:58:09 ] >>556 VxWorksなら_BYTE_ORDERのdefine見れば分かるが他はしらん。
560 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 13:28:05 ] >>554 PDP-11位だしな変態なの
561 名前:デフォルトの名無しさん mailto:sage [2008/11/18(火) 14:44:19 ] >>560 お前はSun、IBM、MIPSを敵に回した。
562 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:25:22 ] vectorについてですが array.reserve(array.size()); でぴったりのサイズに変わるかと思ったのですが変わりません。 大きなデータを扱ったりする場合、ぴったりのサイズで作り直した方が メモリが節約できるかと思うのですが、なぜうまくいかないのでしょうか。 何かいい方法はないでしょうか?
563 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:28:10 ] vector<T>(array).swap(array);
564 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:32:01 ] reserveは拡大する方向にしか働かないのでは
565 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:36:13 ] >>>562 §23.2.4.2.2 void reserve(size_type n); 2 Effects: A directive that informs a vector of a planned change in size, so that it can manage the storage allocation accordingly. After reserve(), capacity() is greater or equal to the argument of reserve if reallocation happens; and equal to the previous value of capacity() otherwise. Reallocation happens at this point if and only if the current capacity is less than the argument of reserve(). 3 Complexity: It does not change the size of the sequence and takes at most linear time in the size of the sequence. greater or qrual と書いてあるから等しいかもしくは大きいとなるので ぴったりのsize()になる保証はない。
566 名前:デフォルトの名無しさん mailto:sage [2008/11/19(水) 16:37:52 ] おっと equal to the previous value of capacity() otherwise. ともあるから、縮小しようとしてもcapacity()は変化しない事になる。 詰まるところ>>563 のようにスワップ技法に頼るしかない。
567 名前:562 mailto:sage [2008/11/20(木) 11:20:10 ] >>563-566 出来ました。ありがとうございます。 サイズの縮小は出来ないんですね。勉強になりました
568 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:13:58 ] 今までイテレータが指してるコンテナのことをイテランドと呼んでたんですが そんなの聞いたことないって言われました ぐぐってもほとんど出てこないので不安になってきたんですが(「イテランド」だとゼロ…) 普通に使いますよね?
569 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:17:07 ] はつみみです
570 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:18:50 ] ぐぐった時点で気づいてるだろwwww俺は聞いたこと無いな iterandにしたら多少出てくるけど、まぁスズメの涙ね
571 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:17 ] あーやっぱり? iterandは1000件くらい引っかかるから、わざわざカタカナにしないだけで あっちでは普通の言葉かもしれないと思ってたんですが じゃあ皆さんはイテレータが指してるコンテナのことはなんて呼んでるんでしょう 「イテレータが指してるコンテナ」ですか?
572 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:24:23 ] イテレータが指してるコンテナ? vector<int>::iterator it; だと vectorが「イテランド」になんの?
573 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:27:10 ] 例えば vector<int> v; vector<int>::iterator it = v.begin(); なら、itはvのイテレータで、vはitのイテランドです
574 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 01:38:03 ] iterateeとか言ってみる。
575 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:09:59 ] Pythonではiterable
576 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:40:26 ] >>575 それは意味が全然違う
577 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 03:50:39 ] iterable はまんまイテレータ(とみなせるもの)。
578 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:37:36 ] itのコンテナ 程度にしか言わないな
579 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 12:54:20 ] イテランドがまあ、何を指している言葉かは オペレータ⇔オペランド からの類推でわかるけどさ。 それより世間一般ではイテレータなんだろうが、 俺はついついイタレータと読み書きしてしまう今日この頃。
580 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 13:15:51 ] >>579 おいたが過ぎますぞ
581 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:24:11 ] いてまうどー
582 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:52:19 ] とりあえず、イテランドがあんまり一般的な言葉じゃないことはよくわかりました 内輪以外では使うのを控えることにします ありがとうございました
583 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:05:31 ] あんまりという表現なのか・・・w
584 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 02:41:16 ] つうかどこでその言葉を習ったんだろ
585 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:27:41 ] イテランドでぐぐるとこのスレが引っかかるなw
586 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 15:47:04 ] イテランドたんのアニメ化が決定したそうです。
587 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 16:56:13 ] とある言語の被反復構造(イテランド)
588 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:09:09 ] パパ〜遊園地いきたーい よーし家族みんなでイテランドにでもいくか〜
589 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:16:39 ] 井手ランド
590 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:32:30 ] とある要素の列挙目録(イテレータ)
591 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 17:46:29 ] イテランドたんの要素数は103000ですね、わかります。
592 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:29:32 ] 変数 X が std::list 型で変数 I がその reverse_iterator だとすると X.erase( I.base() ); で I が示す要素の隣を消去するので I はまだ使えますよね。 VC8 で I を使うと assert で止まるんですけど。
593 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 18:55:16 ] その1行だけ示されてもなあ。
594 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:24:06 ] デバッガで追えばいいじゃん……
595 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:29:51 ] string strに入っている文字列のi番目から後ろをstr2に代入するにはどうすればいいですか?
596 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:56:15 ] str2 = str.substr(i);
597 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 19:57:28 ] substr
598 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:06:38 ] >>592 使えない
599 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 20:25:38 ] 595です。ありがとうございました。あとstringを==で比較するときに小文字と大文字を区別しな方法はありますか? 一度変換しないとだめでしょうか?
600 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:06:58 ] stringはそもそも「大文字と小文字」っていう概念が無いと思う
601 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:10:43 ] 大文字だの小文字だのは真面目にやり出すと大変だぞ ロケールの問題とか
602 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:19:34 ] >>598 std::list の reverse_iterator の場合は1つ後の要素を消去したとき無効になるんですね。
603 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:23:31 ] stringは複雑なんですね・・・わかりました
604 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:30:16 ] 複雑なのはstringではなく、真の国際化です
605 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:51:06 ] "ガ"と"ガ"を==で比較してtrueにできないからstd::stringはクソ
606 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:54:04 ] CLでいうところのequalpを手前で実装しろクソ
607 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:58:17 ] @と`を同じ文字と解釈するべき環境とかあるからな
608 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 21:59:34 ] 7bit ASCII内での大文字小文字無視なら、char_traits自作でやる実装を何かの本で見た。
609 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:03:38 ] typedef pair<double,string> HOGE; void func(??){ HOGE p; p.first = data; p.second = chordname; pairs.push_back(p); } int main(){ deque<HOGE> pairs; for(){ func(); } } mainで作ったdequeにfunc関数で値を入れたいんですがどうしたらいいですか? もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。
610 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:04:09 ] 引数
611 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:11:52 ] 引数なのはわかるんですが・・・ void func(deque<HOGE> &pairs){ } main(){ func(pairs); } こうですかね?
612 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:15:07 ] >もちろんmainのスコープを抜けない限り、dequeが初期化されないようにしたいです。 むちゃくちゃだ。
613 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:20:12 ] えっと具体的にどうおかしいですか?
614 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:22:48 ] 頭がおかしい
615 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 22:35:40 ] mainのスコープを抜ける=プログラムが終わる プログラムが終わった後にdequeが初期化されるって、 atexit内で初期化したいのか
616 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:14:48 ] >>615 ちょっと表現を間違えました。
617 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 23:44:46 ] えっとそれで611で大丈夫ですかね?
618 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:42:48 ] private な vector<int> hoge を外部から走査して数値を得たい const int *mage = &hoge; のような方法でするのかな?と思ったんですが セオリーな方法はどんな書き方なんでしょうか
619 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:45:27 ] 参照せずに値じゃね?
620 名前:618 mailto:sage [2008/11/23(日) 00:45:59 ] いやいまいちお前がなにいってんのかわかんないけど
621 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:47:43 ] hogeをスキャンして数値を返すメソッドを公開すればいいじゃない
622 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:52:10 ] プレイベートなデータなので、捜査には礼状が必要です。
623 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:53:45 ] vectorの中身は連続性が保証されている、 つまりprivateなvectorの、先頭アドレスを返すような関数作って それをconst int * で受け取り(もちろんサイズも)、 そのconst int * を走査するのかな?と思ったけど 書き方がわかんないから>>618 になってしまった ゴメンナサイ(´・ω・`)
624 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 00:58:23 ] beginとendのペアを返す
625 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:02:01 ] >>621 に一票
626 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:09:49 ] >>621 スキャンって・・・? 丸ごとコピーしてそれを返す? 内部でiterator保持して呼び出す毎に進める? 現場の人じゃないから、その手の語彙力ないんだわ(´・ω・`) ちなみに具体的にはintではなく x,y座標が入ってるpair<int,int>で これを取得してGUIでリアルタイムに線を引きたい という状況です
627 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:23:53 ] 現場の人とか関係ねーw >>618 の走査 == >>621 のスキャン だろOKJK それから情報後出しって嫌われるの知らないかね いいから黙ってソースコードべたっと貼れ
628 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 01:27:26 ] では俺はコールバックを提案しよう。
629 名前:618 mailto:sage [2008/11/23(日) 02:19:18 ] >>627 GUIライブラリ使ってる上に携帯厨なんです(ノ∀`) typedef std::pair<int,int> Pos class Hoge{ public: const Pos *getPosArray(int *arraySize); private: std::vector<Pos> p; }; const Pos *Hoge::getPosArray(int *arraySize){ *arraySize = p.size(); return *arraySize ? &p[0] : 0; } こうしてみた コーディングスタイル云々は勘弁してつかーさい
630 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 02:28:25 ] const std::vector<Pos>& ppp() const { return p; } でいいじゃん
631 名前:デフォルトの名無しさん [2008/11/23(日) 14:43:29 ] int function(string &buff){ } main(){ string buff: function(buff); } mainで宣言したstringに関数で値を入れるには、これであってます?
632 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:45:30 ] >>631 いいよ。
633 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:50:04 ] ありがとうございます。 functionでの代入時は buff ="mozi"; みたいな感じでいいですか?
634 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:51:30 ] 俺ルールだと、関数で値を入れる場合はポインタ渡しにして、 単に値を渡すだけなら参照にしてるな。
635 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:56:47 ] >>633 それでいいよ。 値を渡すだけでも、返してもらうときでも参照でいいよ。 const のあるなしで区別すればOK
636 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:57:54 ] >>634 M$ なんかが当初そういう方針だった気がするな。 NULL チェックが必要になるから個人的には微妙なんだが・・・。
637 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 16:31:25 ] >>635 賛成。 それとは別に、俺は std::string 程度なら値を返すようにしたい。 function().length() したいだけだったり、function() で代入したものを他の関数に渡したいだけだったりした時に、わざわざローカル変数を作らなければならないから。 また、ローカル変数に代入すべき場合のうちで初期化後に変更しないものに const を付けられなくなるから。 オーバーロードして両方のバージョンを用意すればいいだけだけど。
638 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:27:34 ] >>635 こうしろと? int& function(string &buff){
639 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:28:40 ] >>638 いや、引数の話だよ。
640 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 19:58:24 ] >>635 int function(int&, double& )とかした場合 function( 1, 0.1) は使えないだろ こんな使い方禁止?
641 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 20:05:30 ] >>640 直前のカキコとか見れよ。 引数で値を返してもらいたいとき、constなしの参照つかえって意味だから、 そういう使い方は意味ないだろ。
642 名前:デフォルトの名無しさん [2008/11/24(月) 19:24:39 ] istreamから数バイトずつ読み取って意味解釈していくような プログラムを作っているのですが、 istream input; short header1; input.read(&header1, sizeof(header1)); short header2; input.read(&header2, sizeof(header2)); こんな感じでしか書けないのでしょうか? short header1 = input.read(sizeof(header1)); short header2 = input.read(sizeof(header2)); などと書ければよいのですが・・
643 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 19:27:10 ] >>642 read<short>(input) とかいう関数でも作れば良いんじゃない?
644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:13:34 ] >>642 short header1, header2; if(input >> header1 >> header2) { // ... }
645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:26:01 ] >>644 そんな餌に(AAry
646 名前:642 mailto:sage [2008/11/25(火) 01:57:17 ] >>643 こんなのを作ってみました。 template<class T> std::istream& read(std::istream& is, T& data) { return is.read(reinterpret_cast<char*>(&data), sizeof(T)); } >>644 それって、inputが文字列なら良いですが、 バイナリ読みしたい場合はダメですよね?
647 名前:デフォルトの名無しさん [2008/11/25(火) 16:50:03 ] vectorのイテレータは足し算ができるのに、listのイテレータではできないんですね。 listで添え字アクセスのようなことをやる場合は、 list<int>::iterator it = list.begin(); for(size_t i= 0; i< index; i++ ) it++; みたいなことをやらないといけないの? 挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、 indexを使ったアクセスも多いので、なんかブサイクですね。 いい方法ないですか?
648 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:55:04 ] >>647 コンテナの種類とランダムアクセスイテレータに関して も少し理解を深めといた方が。
649 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:57:49 ] >>647 std::advance()
650 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:16:49 ] >>648 ランダムアクセスをしたいならvectorを使うべきだと? 一般論ではそうでしょう。 しかし、 vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。 listの場合は配列要素の数にかかわらずコストは一定です。 だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、 処理速度的に最適なものを選びたいと思っています。 それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。 >>649 listの要素の入れ替えをしたくはないのです。
651 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:22:20 ] >>650 つdeque ランダムアクセスできて挿入も速い
652 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:26:38 ] >>651 私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。
653 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:41:22 ] >>652 dequeは途中の挿入も(そこそこ)速いんだよ。 dequeの仕様を満たそうとすると、どうしてもそういう実装になる。
654 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:02:08 ] >>650 要件がいまいちつかめないので何ともいえないけど、 規格を眺めてlistが最適だと思うなら仕方がないんじゃない? listはランダムアクセス出来ないしね。 でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ
655 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:14:47 ] >>652 要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
656 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:39:03 ] 周りがアドバイスしても結局自分の方法に固執するんじゃ 何言っても意味ないよ そういうのはほっとくに限る
657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:44:27 ] 挿入/削除が多いならリストを使うべきだろ ときどきランダムアクセスが必要ならstd::advanceで
658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:51:51 ] advanceを思いっきり勘違いしてる節があるよね
659 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:58:49 ] >>655 配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。 VS2005でコンパイルした場合だけど。
660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:05:31 ] >>659 何が?
661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:28:06 ] 用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな STLにはないけど
662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:31:05 ] >>647 より後の返答カキコ 本当に>>647 なのか? おまえら、誰かに釣られてないか? IDのない板って、なりすまし可能だからな
663 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:35:42 ] 質問に答えてるだけなんだから、>>647 と>>650 が同一人物であろうとなかろうと何も関係ない 釣りだったとしても痛くも痒くもない
664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:03:28 ] std::vector<要素 *>
665 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:30:10 ] skip listか んなもんわざわざ使うなら普通にlistでもいいと思うけどな
666 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:40:43 ] setについて質問です www5c.biglobe.ne.jp/~ecb/cpp/07_15.html 要素の追加(追加場所をイタレーターで指定) 定数時間 とありますが、追加場所をイタレーターで指定とはどういうことですか? insert関数ではないですよね?
667 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:02:51 ] >>647 はlistを使うのを前提として質問していて listの代わりに何が良いかは質問してないようによめるのだが
668 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:04:52 ] >>666 insertのことだと思うが
669 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:11:14 ] >>666 setにはイテレータを指定するinsertと指定しないinsertがあるよ
670 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:15:27 ] vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので クラスのポインタを入れて使おうかと思ってるのですが 何か注意しなければ行けない点はありますか?
671 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:17:35 ] >>670 ないです。
672 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:18:02 ] あります vectorから取り除いたときのdeleteし忘れ
673 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:20:48 ] >>670 オブジェクトの多重参照
674 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:54:32 ] FUGAはduobleとstringのpairです multiset<FUGA> huga; にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか? count関数がありますけど使い方が・・・ huga.count("hogehoge");みたいな感じで使いたいんです
675 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 22:04:16 ] >>674 count_if()
676 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:21:30 ] >>671-673 サンクス deleteしなきゃだったんだな ありがとう
677 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:50:01 ] >>670 ptr_vectorでも使えば
678 名前:デフォルトの名無しさん [2008/11/26(水) 11:06:22 ] KOUZOUTAI data[100]; partial_sort( data, data + 10 ,data+100, Sortpred1) ってできますけど vector<KOUZOUTAI> data(size); partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1) ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?
679 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 11:18:38 ] >>678 data.begin() + 10
680 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 12:37:31 ] const_iterator を iterator に変換するために distance() と advance() を使う方法が Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で 変換できません。 std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
681 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:34:21 ] typedef std::set<A,B> C std::set<C::const_iterator,C::iterator> を作って変換しろ
682 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:46:58 ] >>681 std::set, std::map の検索は普通の実装で対数時間
683 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 18:49:39 ] *reinterpret_cast<std::set<A>::iterator*>(&cit) 大体の実装なら通るよ 細かいこと気にすんなってwwwww
684 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 20:24:23 ] 対数時間なら別にいいんじゃね
685 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:02:08 ] >>680 とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
686 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:35:37 ] >>680 定数時間にこだわるんならどうぞ std::tr1::unordered_map<C::const_iterator, C::iterator>
687 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:23:23 ] vector<vector<T> > WArray; WArray warr (100, vector<T>(10)); T型の2次元配列を作る場合、このようにすることが多いのだけど 全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ を知りたい場合、方法は無いのでしょうか?
688 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:44:30 ] > 全体のデータサイズは、size_of()関数で取得できるけど、 できるか?
689 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:57:26 ] >>688 >>687 です ごめんなさい、間違えました size_t size = warr.size(); こうでしたね(^^;
690 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:29:30 ] いや、それ全体じゃないから。
691 名前:デフォルトの名無しさん [2008/11/30(日) 17:38:11 ] detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?
692 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 17:41:32 ] マルチ市ね
693 名前:デフォルトの名無しさん [2008/11/30(日) 17:45:42 ] detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください
694 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:34:07 ] さっさとしね
695 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:02:34 ] 大体わかるけどマルチ野郎には絶対教えない
696 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:08:26 ] こんなファイルがあって、 -- a foo FOO a fooz FOOZ a foz FOZ b bar BAR b baar BAAR -- その場合、こんな関係を現わしているんだけど、 -- a-+-foo +-fooz +-foz b-+-bar +-baar -- どんなデータ構造にするのが手頃か相談に乗ってくれまいか。
697 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:17:04 ] 何やりたいかによるだろうが、単に vector vector ではだめなの?
698 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:26:09 ] aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、 aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。 おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
699 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:31:12 ] mapでいいだろ
700 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:32:12 ] 楽しようと思えばmap<string,map<string, string> >かなぁ
701 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:51:58 ] >>698 なんかよくわからんが、vector<pair<>> を含む class を作れば いいのかな。出力もメンバ関数でもできるし。
702 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:17:48 ] multimap<string,pair<string,string>>とかかな・・・ S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR"))) みたいなのを表現したいってことなら
703 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:34:40 ] struct Entry { string type, id, name; bool operator<(const Entry &a) const { return type < a.type; } }; multiset<Entry> entries; でequal_range使わせるかな
704 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 02:41:11 ] 定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。
705 名前:696=698 mailto:sage [2008/12/04(木) 06:11:17 ] レスありがと。 なるほど、色々手はありそうだね。 ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。 # 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
706 名前:デフォルトの名無しさん [2008/12/04(木) 20:31:19 ] vectorを配列っぽく使ってるんですが、 eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか? vec.erase(vec[5]) vec[5].erase() みたいなことはできませんか?
707 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 20:34:31 ] begin()+5
708 名前:706 mailto:sage [2008/12/04(木) 20:36:56 ] おおー。感動です。ありがとうございました。
709 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:10:14 ] まあ使い辛いとは思うがな・・・。
710 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:28:47 ] 関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。 とどうでもいい回顧
711 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:29:42 ] . はともかく + は・・・。 数学的に、単独の方が違和感あると思われ。
712 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:34:59 ] 右辺値やな
713 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:12:57 ] for_eachの使い方を知ったときは感動したけどやっぱり使いづらい
714 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:21:25 ] lambda なしに for_each だけあってもね・・・。
715 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 10:23:09 ] range adapterも欲しいナ
716 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:00:27 ] rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない
717 名前:デフォルトの名無しさん [2008/12/06(土) 15:46:46 ] deque<string> buff; にpusu_back()は定数時間ですか?それと buff[0]みたいなアクセスはありですか?
718 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:32:10 ] 「deque push_back 定数時間」でググれば、皆同じことを言っているし、 buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、 何故こういう質問が書き込まれるんだろう。 あと、「みたいな」っていうのがよくわからん。 それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、 その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。 もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、 そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。 答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
719 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:39:40 ] >>718 そんなのはいいから答え教えろかす
720 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:46:12 ] 長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな
721 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:49:17 ] std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので operator[]によるrandom accessが可能かつ、 push_backによる要素追加は償却で定数時間であることが保証されています
722 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:45:09 ] >>720 > 長々となに書いてんだろ 馬鹿が読むと煽りたくなるアドバイスじゃない?
723 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:13:35 ] むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw
724 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:18:33 ] これらの操作を提供するための条件として規定されてるからね。
725 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:15:49 ] set とかは insert だしな。
726 名前:デフォルトの名無しさん [2008/12/09(火) 14:44:05 ] vectorの2次元配列はどうすればいいんですか? 2次元目も動的にしたいんです
727 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 15:04:51 ] vector<vector<int> > v;
728 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:27:55 ] ありがとっ
729 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:01:36 ] これって問題ある? class CVector { vector<int> A; } vector<CVector> B; CVector.A.resize(10); B.resize(10);
730 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:03:22 ] class CVector { vector<int> A; }←セミコロンがない vector<CVector> B; CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい B.resize(10);
731 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:21:46 ] あそうか、こうしないとインスタンスが作れなかった class CVectorSub { public: vector<int> A; }; class CVectorMain { public: vector<CVector> B; }; class C { public: CVectorSub vSub; CVectorMain vMain; void Resize() { vSub.resize(10); vMain.resize(10); } };
732 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:24:20 ] やばい 2次元配列じゃなくなってる 意味ねぇ
733 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:39:28 ] あ!わかったthx! class CVectorSub { public: vector<int> A; }; class C { public: CVectorSub vSub; vector<CVectorSub> vMain; void Resize() { vSub.A,resize(100); vMain.resize(10); } };
734 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:44:36 ] うわ・・・これダメだ
735 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:45:35 ] >>733 vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。 わかってるならいいんだけど。 エスパーすると vector<vector<int> > vec; vec.resize(10); for(int i=0; i!=vec.size(); ++i) { vec[i].resize(10); } なんじゃないかと。 違ったら無視して。
736 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:56:13 ] いやそれです。ありがとう それだと全部同じ配列数になるのかと思ってしまった。 vec[0].resize(10); vec[5].resize(20); こう出来たんだ。 暴れてしまった・・・すまんTHX
737 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:12:04 ] 2次元配列の初期化とポインタの使い方あってますか? vector<vector<int>> vec(5, vector<int>(100, 0)); vector<vector<int>>* pVec = vec; pVec[3]->resize(200); pVec[3][180] = 12345;
738 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:33:26 ] いいえ。
739 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:37:41 ] >>737 > vector<vector<int>> まずこれがだめ。正しくは vector<vector<int> > 2行目はコンパイル通らない。 3行目と4行目も意味がめちゃくちゃ。
740 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:27:03 ] ポインタをインデクサで参照して実態をアロー演算子で参照してるがな 大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし つーか何でポインタが出てくんの?w
741 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:35:38 ] 何がしたいかよく分からない例だが そのまま直すとこんな感じか vector< vector<int> > vec(5, vector<int>(100, 0)); vector< vector<int> > *pVec = &vec; (*pVec)[3].resize( 200 ); (*pVec)[3][180] = 12345; しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;
742 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:44:08 ] ありがと。 本2冊読んで> >の間のスペースがわからないのがやばい vector<vector<int> > vint; vector<vector<char> > vchar; ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど vector<vector>* pvec = char; ここの書き方がわからないお願い!
743 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:06:59 ] そこでテンプレート関数の出番ですよ main() { vector< vector<int> > vint; vector< vector<char> > vchar; if(〜〜〜) test(vint); else test(vchar); } templete<class T> test(T &vector) { vector[3].resize(200); vector[3][180] = 12345; } 適当に書いたから間違ってるかも分からん
744 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:27:33 ] >>742 共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。 なので>>743 の方法になる。
745 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:40:36 ] いや何を書いてあるのかがわからなかった コンテナの前にテンプレートを勉強してくる ありがと、まじありがとっ
746 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:45:38 ] 今更勉強するより0xまで待った方がいいかもなー
747 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:41:07 ] それは0x完全対応コンパイラを待ってから勉強するってこと? あ、老後の楽しみか
748 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 06:28:40 ] なに微妙に興奮してんのw
749 名前:デフォルトの名無しさん [2008/12/12(金) 07:10:55 ] >>748 オ○ニーしながらだからねw
750 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:04:47 ] 上級者すぐるw
751 名前:デフォルトの名無しさん [2008/12/13(土) 01:33:45 ] [SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)
752 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:34:59 ] 0x ってもうあと一年しか残ってないんだ
753 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:13:07 ] もしかして 09 でなくて 0xa だったりして
754 名前:デフォルトの名無しさん [2008/12/13(土) 12:24:32 ] すみません、c++のカスタムアロケータでの質問なんですが カスタムアロケータとしてmy_allocatorを作り、 それを指定したbasic_stringを typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string; と定義しました。 それでやりたいことなんですが my_string ms = "ms test"; std::string ss = "ss test"; ms = ss; と、アロケータの違うコンテナ同士で代入をしたいのです。 今はとりあえず my_string ms = "ms est"; std::string ss = "ss test"; ms = ss.c_str(); としてますが、ちょっと不恰好で気になってしまいます。 なにかスマートな方法はありますでしょうか?
755 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:50:12 ] assert(ms.size() >= ss.size()); std::copy(ss.begin(), ss.end(), ms.begin());
756 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:04:10 ] おぉなるほど、イテレータを使えばいいんですね。 ありがとうございます。参考にして作ってみます。
757 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:19:49 ] ss.assign(ms.begin(), ms.end());
758 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 18:59:03 ] STLの仕様とかよく理解できてないから根本的におかしいかもだけど、 map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型) コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
759 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 19:12:31 ] 失敗ってどんな?
760 名前:758 mailto:sage [2008/12/15(月) 19:15:39 ] >>759 insert()したときの戻り値の.secondが必ずfalseになる
761 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 20:35:44 ] エラーが起きる最小限のソース貼ってみ
762 名前:758 mailto:sage [2008/12/15(月) 21:15:36 ] ↓にうpしときました www3.uploda.org/uporg1858304.zip.html Passはstlです 一応環境も書いときます WinVista SP1 VS9
763 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:26:08 ] 一時オブジェクト?
764 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:45:41 ] >>762 ttp://msdn.microsoft.com/en-us/library/ms632679.aspx CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。 insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
765 名前:758 mailto:sage [2008/12/15(月) 22:46:02 ] ローカルのものをmapにはinsert出来ないということですか?
766 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:01:01 ] 764が言ってるのは、 自分でinsertを呼ぶよりも前に、WndProcが呼ばれて LPFUNC lpfn = hoge[ hWnd ]; で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
767 名前:758 mailto:sage [2008/12/15(月) 23:11:12 ] なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。 つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
768 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:12:11 ] >>765 つ // LPFUNC lpfn = hoge[ hWnd ]; // if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL; これでinsertは成功
769 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:18:39 ] わざわざエラー検査する必要ないのでは? hoge[ hWnd ]=lpfn; でいいじゃない
770 名前:758 mailto:sage [2008/12/15(月) 23:25:16 ] 無事解決しました。>>764 >>766 >>768 ありがとでした。 ちょっとSTL関係の本を探して勉強しなおしてきますw
771 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:17:45 ] STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
772 名前:758 mailto:sage [2008/12/16(火) 17:26:11 ] CreateWindowが幾つかメッセージ送るのは知ってたんですが、 find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、 対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。