1 名前:858 [2007/12/24(月) 03:41:59 ] C++標準ライブラリの一つ、STLについて。 前スレ 【C++】STL(Standard Template Library)相談室 7 pc11.2ch.net/test/read.cgi/tech/1185986999/ 過去ログ・リンク・書籍紹介は >>2 以降
2 名前:858 mailto:sage [2007/12/24(月) 03:42:34 ] 【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 名前:858 mailto:sage [2007/12/24(月) 03:43:17 ] リンク切れとか見てないぞ 入門ページなど ・入門 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 名前:858 mailto:sage [2007/12/24(月) 03:43:53 ] 書籍紹介 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 名前:858 mailto:sage [2007/12/24(月) 03:44:36 ] 関連スレ C++相談室 part59 pc11.2ch.net/test/read.cgi/tech/1192866305/ Boostを語れゴラァ part5 pc11.2ch.net/test/read.cgi/tech/1192662575/ C++0x 2 pc11.2ch.net/test/read.cgi/tech/1191842951/
6 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:31:41 ] >>6 スレ立て乙
7 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 13:43:05 ] >>1 すれたて乙。 新しいすれでも>>858 名乗るのか?
8 名前:デフォルトの名無しさん [2007/12/24(月) 16:19:16 ] std::pair のインスタンスから first および second を 取り出すファンクタは std の下に用意されていますか? boost::tuples::get<0> みたいなやつを探しています. 自分で定義してもいいんですが,標準的な方法が 用意されているのであればそちらに従いたいと思います.
9 名前:デフォルトの名無しさん [2007/12/24(月) 16:32:24 ] >8 確か標準には無い。 g++だと、#include <ext/functional> して、 __gnu_cxx::select1stとかselect2ndが使える。
10 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:36:58 ] mem_funのメンバ変数版とかないの?
11 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:43:24 ] boost::mem_fn
12 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:15:22 ] ベクタコンテナを初期化子で初期化する場合 vector<int> vec; Foo::Foo() : vec() {} こうしてるんだけど、間違ってない?
13 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:37:34 ] 間違ってはいないけど、要素数0で初期化なら何もしなくてもいい。
14 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:55:05 ] >>13 サンクス そこが聞きたかったんだけど、vectorは初期化しなくても使えるのは知ってたけど どのタイミングで、初期化を行ってるの? vector型のインスタンスが作成される、手前で初期化をにやってると想像するんだけど
15 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 19:56:07 ] コンストラクタが呼ばれるだけですが
16 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:08:36 ] >>15 なるほど、コンストラクタが呼ばれたら、そこで初期化が行われる仕組みになってるんだ 納得シマスタ
17 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:12:08 ] どんだけ〜
18 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:47:24 ] コンストラクタは何の為にあると思ってたんだろう
19 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:08:39 ] >>17 気持ち悪いです。自殺してください。
20 名前:デフォルトの名無しさん [2007/12/25(火) 00:12:46 ] 件のvectorのコンストラクタで質問なんですが、 vectorのオブジェクトを生成するとメモリ割当て子を一つ生成してさらに割当て子を2回コピーしてるようなんですが、 なんでvectorは合計で3つも割当て子のオブジェクトを用意してるんですか?
21 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:16:25 ] その挙動はコンパイラの実装次第だから何ともいえない。
22 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:16:54 ] 先頭ポインタ、末尾ポインタ、メモリ確保領域の末尾ポインタの3つ。
23 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:19:35 ] 割当て子ってアロケーターの事だと思った。
24 名前:20 mailto:sage [2007/12/25(火) 00:31:57 ] レスありがとうございます。 もう一度コードを読見直してみます。
25 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 00:59:29 ] 見直すってvectorの実装をか?勉強のためなら止めはしないが・・・ その実装がどの環境でも同じかどうかなんて保障はないぞ。 別にお前さんは何も間違っているわけでもなく、そういうものだと理解するんだ。
26 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 07:45:18 ] 20の場合では、コンストラクタの既定引数の実引数として1つ作られ、 そこから仮引数へのコピー、そこからvectorのメンバ変数へのコピーで2回だろうな。
27 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:26:47 ] vector<int> vec; 〜 vecに対する処理(入れたり、出したり) 〜 if( !vec.empty() ) erase( remove( vec.begin(), vec.end()) ); コンテナの要素が空でない場合、要素を全削除する関数ですが、これをtemplateに してもらえませんか、宜しくオナガイシマス
28 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:39:03 ] >>27 erase() とか remove() とかの使い方がおかしくてよくわからんけど、 それは無条件で全削除する、つまり vec.clear() と何が違うの? template にすると言われても何をテンプレート引数にするのか決めないと どうにでもできてしまうよ。 template<int N> ... とか。
29 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:44:46 ] >>28 サンクスです vecの型が vector<double> vecであってもvector<string> vecでも 削除できるようにしたいのですが?
30 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:47:17 ] ごめんなさい erase( remove( vec.begin(), vec.end()), 削除したい特定の要素 ); でした
31 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:58:36 ] >>29-30 情報小出しの兆候が見られて嫌な感じだな。 いくらかわかったけど、細かい仕様がわからないから何ともできない。 たとえば関数テンプレートにしたいんなら関数の戻り値や引数がわからない。 とりあえず自分で書いた奴みせて。
32 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 05:00:55 ] >>29-30 こうですかわかりません template<typename T> void erase_it(vector<T>& vec, const T& value) { vec.erase( remove(vec.begin(), vec.end(), value), vec.end() ); }
33 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 06:49:01 ] まだ続々と新情報が出てくるだろうから しばらく適当にイジってたほうがいいと思うよ
34 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 18:45:34 ] >>27 です 夕べは眠くて、質問を書き間違えました >>コンテナの要素が空でない場合、要素を全削除する関数ですが、 これが間違いで vector型のコンテナで、特定の要素を削除できる汎用的な(Template)の書き方が 教えて欲しかったのです ですので、32さんありがとう
35 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:12:02 ] 27です、32さんに教えてもらって、Templateの書き方が何となく分かってきた 気がします、連投で申し訳ないけど コンテナの空チェックで vector<int> vec; if(!vec.empty()) vec.clear(); 〜空で無い場合の処理 この様な書き方をすると思うのですが、Templateにした場合 この書き方は間違っていますか? template<typename T> void empty_it(vector<T>& vec) { if(!vec.empty()) vec.clear(); }
36 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:13:18 ] つーか、vec.clear()だけで充分ですが。
37 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:14:22 ] >>36 空のコンテナを vec.clear()すると アクセスバイオレーションになりませんか?
38 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:16:56 ] なんでそんなことになると思うの?
39 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:19:50 ] 以前、空のコンテナをclear()したら、そうなった気がしたんですが 今手元に、コンパイラが無いんで確認できないんですが、 勘違いだったのかなぁ・・・
40 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:23:39 ] >>39 メモリ破壊でもしてたんだろ
41 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:27:46 ] >>40 ってことは、空のコンテナをclear()しても、問題は無いってことですか? やはり>>35 の処理は不要ってこと?
42 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:30:51 ] >>41 問題ない。不要。
43 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:33:07 ] >>42 了解したよ ありがとう、幾ら簡単な例ができても、何の役にも立たなくては、意味無いからね
44 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:04:40 ] 解決した途端、敬語が消えてどっかの審査員みたいな目線になるのは GoFでいうとなにパターンですか?
45 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:08:14 ] pimpl
46 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 01:06:28 ] Observer
47 名前:デフォルトの名無しさん [2007/12/29(土) 01:46:38 ] vector::insert()で、 insert(先頭位置, 挿入数, 挿入する物) insert(先頭位置, 挿入する物.begin(), 挿入する物.end()) というバリエーションがあるみたいなのですが、どういうバリエーションがあるかは どうやって知るのでしょうか?manページとかがあるのでしょうか?
48 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 01:56:47 ] >>47 こことかどう? www.wakhok.ac.jp/~sumi/stl/
49 名前:デフォルトの名無しさん [2007/12/29(土) 02:07:58 ] >>48 ありがとうございます!
50 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 02:18:00 ] 俺が今仕事で使ってる環境にはstdc++のmanが入ってるな。 ただ所々間違ってるんだけどw std::mapのerase(iterator position)がpositionの次のiteratorを返すって書いてあったりする。
51 名前:デフォルトの名無しさん [2007/12/29(土) 11:30:15 ] そういや >>47 のようなことを思っていた時期もあったけど, いまや IntelliSense に頼りっきりになってしまった. そろそろ趣味グラマで Linux 上でのプログラミングも しようかと思うんだけど,Emacs でそういう補完とか やろうと思うとどんな *.el 入れれば便利なんだったっけ?
52 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:46:27 ] 俺はここ使ってる www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/stdref/classref.htm
53 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 16:28:45 ] Linuxとかならglobalかな emacsには標準でついてる
54 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:31:50 ] typedef struct ST_TABLE { int num; int headdate; int taildate; ST_TABLE( ) : num(0), headdate(0), taildate(0){} }ST_TABLE; このような、構造体を持つvector型のコンテナから、for_eachを用いて headdateの最大値を求める、Templateの作り方を教えてもらえませんか vector<ST_TABLE> containerIndex containerIndexには、要素が入っていることと仮定して for_each( containerIndex.begin(), containerIndex.end(), &head ); template<class T> int head(const vector<ST_TABLE>::iterator T& t) { ここまでは分かるのですが(間違っているかもしれない。。。。多分間違ってるでしょうorz)
55 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:35:56 ] 間違ってます。3引数のstd::max_elementを使いましょう。
56 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:41:54 ] これでは、エラーが沢山出てしまうのですが... for_each( containerIndex.begin(), containerIndex.end(), head ); template<class T> int head(const vector<ST_TABLE>::iterator T& t) { return max_element t->headdate; t++; }
57 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:49:26 ] max_element(v.begin(), v.end());
58 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:50:08 ] >>57 ミスった。スルーしてくれ
59 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:59:05 ] >>56 だけど できちゃったけど、オーバーロード使って、でできちゃったww templateでは、できないものかなorz
60 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 00:54:29 ] templateで、の意味がいまいち不明だけど、max_element(begin, end, comp)使えって。
61 名前:デフォルトの名無しさん [2007/12/31(月) 10:52:36 ] vector<int> v, w; があったときにvからwへcopy_ifするとき、wの要素の方が少ないとクラッシュするのですが、 そういうときにもwを拡張しながらcopyするにはどうすればいいですか たとえば copy (v.begin(), v.end(), w. begin(), even()); 解決方法としてはv.size()であらかじめw.reserveしておくといいのですが、 vは巨大な配列でwは小さいので余計な領域を予約しまくるのが気持ち悪いです
62 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:10:29 ] 自己解決しました。 copy (v.begin(), v.end(), back_inserter(w), even()); ありがとうございませんでした。
63 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 11:40:20 ] それだと不必要に非効率になるかも。 w.reserve(w.size() + v.size()) で必要な分のサイズを確保してから、 w.insert(w.begin() + w.size(), v.begin(), v.end()) とやったほうが、 多分(←重要。真相は調べるべき)効率が良い。
64 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:12:24 ] reserveするだけじゃ実行時エラーになるかも
65 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:36:44 ] vector<int> vec1 vector<int> vec2 vector<int> vec3に vec1の要素1,2,3,4,5,6,7,8,9,10 vec2の要素4,5,6 とします、vec1とvec2をマージして、重複値を持たないように vec3の要素1,2,3,4,5,6,7,8,9,10 としたいのですが、↓これだと merge( vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), back_inserter ( vec3 ); unique( vec3.begin(), vec3.end() ); vec3の要素1,2,3,4,5,6,7,8,9,10,4,5,6 となってしまいます どうしたらいいですか?
66 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:47:23 ] uniqueって、remove_ifなんかと同等のインターフェースで、 vec.erase( remove_if( vec.begin(), vec.end(), cond), vec.end() ); みたいな構成にしないとだめ、じゃなかったっけ。
67 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 15:49:19 ] STLじゃないけど #include <cassert> #include <pstade/oven/equals.hpp> #include <pstade/oven/uniqued.hpp> #include <pstade/oven/merged.hpp> #include <pstade/oven/initial_values.hpp> #include <vector> int main() { using namespace::pstade::oven; using namespace std; vector<int> A = initial_values(1,2,3,4,5,6,7,8,9,10); vector<int> B = initial_values(4,5,6); assert( equals(A,A|merged(B)|uniqued) ); } こんな感じでいちいちeraseだの使わずに書きたい気分
68 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 16:45:30 ] >>65 だけど あのぉーすみませんが、pstadeってなんっすか? boostライブラリィの一種?
69 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:19:44 ] p_stadeさんの作ったC++ライブラリ
70 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:37:06 ] かなりマニアティックなものなんですか? 解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜 参ってるんだよね、コンテナ二つがそれぞれ500件と5000件で先の要件を満たす ようにすると、PCが1,2秒固まるんだよね p_stadeさんの作ったC++ライブラリって速度速いの? template < typename ForwardIterator > ForwardIterator to_unique( ForwardIterator lhs, ForwardIterator rhs ) { ForwardIterator result = lhs; for( ForwardIterator it = lhs; it != rhs; ++it ){ if( std::find( lhs, result, *it ) == result ){ *result++ = *it; } } resulturn result; }
71 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:38:00 ] sort→unique→eraseじゃないの。これが遅いからどうにかしたいって話か?
72 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:54:26 ] >>70 は >>65 の件
73 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 20:01:07 ] 俺の環境(athlon64 3000+,gcc4.1.2,linux2.6 x86)ではstlのを1とするとovenは10、>>70 のは40ぐらいの時間だった libstdc++でのuniqueの実装はadjacent_findで先頭部分で既にuniqueになってるものを飛ばし あとはuniqueになっている部分の末尾と比較しながら uniqueであるなら末尾の次にコピー、そうでないなら無視といった具合に イテレータが進んでいくだけってシンプルなものだったから、それと比較したらまぁそんなもんかとはおもうけど 2.3秒かかるってのはstd::vectorのreserve()をせずにどんどん突っ込んだとかそういう要因の方がでかそう
74 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:56:28 ] p_stade(笑)
75 名前:デフォルトの名無しさん [2008/01/02(水) 03:41:11 ] >>70 >解答が無かったんで、今自力でtemplate作ったけど、速度がでねぇ〜 for文の中でfindしてりゃそりゃ遅いだろうよw ハッシュつかえば一発じゃん。
76 名前:デフォルトの名無しさん [2008/01/02(水) 10:38:22 ] 「ハッシュ」て、ハッシュドビーフのハッシュですか?
77 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 10:46:25 ] はい
78 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 12:04:26 ] ハッシュド、即ちハッシュキーに変換されたビーフ。
79 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 12:53:45 ] お前の話はつまらん
80 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 14:21:50 ] >>76 つまらん話のおかげでシチューを 火にかけっぱだったのを思い出した。 マジ感謝。 # 正月2日からレトルトってのもアレだが。
81 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 21:35:31 ] >>80 レトルトかよ! 時間とれる時くらいまともな料理しろって。(実は喰い物作るのって上手なスレッド処理みたいで面白いのだ)
82 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 23:21:32 ] >>81 分かるw コンロが複数あると加熱で複数スレッドとか、火入れてる間に別の一品の下ごしらえとか。 慣れてくると俺OSがマルチスレッドに最適化されてくるのが分かる。
83 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 23:53:15 ] 生活板か料理板か喪男板かダム河川板でやれ
84 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:33:58 ] ダム河川板とのつながりを理解できない俺は負け組み。
85 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 05:22:00 ] >>84 がデッドロックしてるお…
86 名前:デフォルトの名無しさん [2008/01/03(木) 08:54:14 ] 定数を返すファンクタってありませんか? って自分で書くのは簡単ですが, 標準があればそれを使おうと思います.
87 名前:デフォルトの名無しさん [2008/01/03(木) 09:50:18 ] >>86 質問の意味がわかりません。
88 名前:デフォルトの名無しさん [2008/01/03(木) 11:07:20 ] www.zvon.org/other/haskell/Outputprelude/const_f.html 的なやつのことだったら、自作しないと標準の範囲では存在しないはず。 それ以前にid関数もなかったはずだ。 boostは知らんので当該スレで聞いてくれ。
89 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:01:01 ] メイヤーズ先生の本を読んで、STLとマルチスレッドって相性悪いと言うか、 結局、期待通りの動作は、実装依存で全てのSTLの振舞いが保障されてないみたいなことが書いてあったな STLを駆使した、マルチスレッドプログラミングって、かなり精通しないと難しそうな印象を持った
90 名前:デフォルトの名無しさん [2008/01/03(木) 21:33:28 ] C++0x でスレッド関係のライブラリが標準で入るようになれば 改善されると期待してるんだけど,無理かなぁ.
91 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:09:54 ] >>89 その本ではどう動く事を期待してたの?
92 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:36:22 ] >>その本ではどう動く事を期待してたの? Effective STL本に書いてあるのは STLのコンテナでマルチスレッドをサポートする基準、ようするに、実装から 最大限望めることは ★複数の読み取りが安全である ★異なるコンテナへの複数の書き込みは安全である 以上で全てと書いてあるよ、ただし。「望むこと」はできるが、常に実現できるとは 限らないことに注意しなければなっらない。こうした内容を保障する実装もあり、保障しない実装もある。 とのことです、漏れ自身、STLを使ってない、マルチスレッドの実装をリファクタリング∩改造したことはあるけど、 STL∩マルチスレッドの経験ないからあんまり良く分かんないけど、なんか考えても難しそうな希ガスる。
93 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:40:27 ] >STLとマルチスレッドって相性悪いと言うか うわさではよく聞くんだけどさ・・。具体的にこの場合に絶対におかしくなる ってコードとどのSTL実装かを知ってる人っているのかな? いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。
94 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:43:54 ] 続き。以前にSolarisのSTLでクラス変数をがんばってpthread_lockで 囲ってる実装を見て、なんかあぶなそうだなあと思った記憶はある。
95 名前:デフォルトの名無しさん [2008/01/03(木) 22:44:08 ] libstdc++については、"XXX MT"でgrep してみるといくつか既知のバグがあることがわかるよ。 文字列の参照カウントまわりとか。詳しくはbugzillaをどうぞ。
96 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:55:23 ] >>93 >>いまどきのLinuxとかWinでは問題ないとか勝手に思ってるんだけどさ。。 その本にも、同じようなことが書いてある マルチスレッドプログラムの作成は難しく、STLの実装が最初から完全な スレッドセーフであればと願うプログラマーは多いと また、後先逆になったけど >>具体的にこの場合に絶対におかしくなる >>ってコードとどのSTL実装かを知ってる人っているのかな? 具体的なミューテックスを、行う際の完璧な(著者いわく)Lock方法が載ってるよ
97 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:59:59 ] 後、STL以外のマルチスレッドの実装方法は難しいので、それに関しては ビョーン本と、自分の書いた(メイヤーズ先生)MoreEffective C++を 読めとも書いてある
98 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:14:41 ] std::stringとかがCOWな実装ならロックしててもまずいよね場合があるよね。
99 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:16:52 ] そうだね。詳しくはMore Exceptional C++嫁という感じかな。 翻訳されてないけど。
100 名前:デフォルトの名無しさん [2008/01/06(日) 20:55:32 ] >>86 はどうなった?