[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 11/25 00:30 / Filesize : 208 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 8



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はどうなった?








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<208KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef