[表示 : 全て 最新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 以降

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

101 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 21:10:40 ]
日本語でおkとなった

102 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 22:58:34 ]
これだから関数型言語のひとつも使えない連中は以下略

103 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 02:04:14 ]
>>86>>100
Boost.Lambdaのconstantは望むものと違う?



104 名前:デフォルトの名無しさん [2008/01/10(木) 23:19:46 ]
a

105 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 13:33:47 ]
b

106 名前:デフォルトの名無しさん [2008/01/11(金) 14:01:47 ]
初歩的な質問で申し訳ないのですが
class sample{
public:
vector<int> vector_int;
list<double> list_double;
〜省略〜
}
というようなクラスをnew演算子で動的に生成した場合、delete演算子で解放
する際にはメンバのvectorやlistのメモリも解放されるのでしょうか。

ご教授お願いします

107 名前:デフォルトの名無しさん [2008/01/11(金) 14:11:45 ]
>>106
される.
安心して使いたまえ.

108 名前:デフォルトの名無しさん [2008/01/11(金) 14:18:33 ]
>>107
ご教授ありがとうございます。

また質問で恐縮なのですが関連して、メンバを
vector<int> *p_vector_int
とし、コンストラクタ内で動的にメモリ確保したとすると、この場合はデストラクタ内
で解放するように定義しとかなければいけないのでしょうか?



109 名前:別人 mailto:sage [2008/01/11(金) 14:42:35 ]
>>108
そのとおり、でも
sample a;
sample b = a;//もしくはsample b(a);
これでデストラクタが呼ばれると同じポインタを複数回deleteしたりする未定義動作になるから注意してね。

110 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 14:49:55 ]
>>108
コンテナをnewするなんて糞みたいなことはやめたまえ。

111 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:00:28 ]
>>109
>>110
ありがとうございます。

確かにコンテナをnewで確保するっていうのも変な話かも知れないです。 
動的なメモリ確保・解放っていうのがintやdoubleといったような基本的な
型でしか情報が見つからなかったので、クラスや可変長配列の場合どうなるのか、
モヤモヤしていたんですが、すっきりしました。ありがどうございました。

112 名前:デフォルトの名無しさん [2008/01/11(金) 15:05:27 ]
>>108
解放忘れが気になるなら,
std::auto_ptr を使うといいよ.

113 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:06:50 ]
>>112
調べてみます。ありがとうございます



114 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:08:25 ]
auto_ptrなんて落とし穴満載の使いづらいのを進めるなよ。

115 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:10:54 ]
>>114
そこらへんは、自分で判断しますので大丈夫ですよ・・・きっとw

116 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:19:07 ]
>>108
boost::shared_ptr (or boost::scoped_ptr)

boost::shared_ptr<std::vector<int> > sp_vector_int;

117 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:24:57 ]
>>111
動的確保する為のコンテナを、動的確保なんて「例」だとしても阿呆過ぎる。

118 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:30:23 ]
大量に複数のコンテナを用意する場合、コンテナのメンバ変数に
メモリが圧迫されることがあるので、newするケースもあると思うがなぁ。

119 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 15:34:45 ]
Container<Container<Type> >

120 名前:デフォルトの名無しさん [2008/01/11(金) 15:49:21 ]
>>114
だって,boost のビルドからしろって勧めるのも気が引けるじゃないか.

121 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:03:12 ]
>>120
いや、なるべくbestの回答をするのが親切だと思う。

122 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:07:43 ]
boost::shared_ptrはboostの他のライブラリに依存しない設計方針らしい

123 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 16:13:54 ]
ビルドが必要なのは実装依存のコンポーネントだな。
thread関連とかasio(まだ無いが)とか。
shared_ptrなんぞバイナリー落としてインストールするだけだ。



124 名前:デフォルトの名無しさん [2008/01/11(金) 17:24:46 ]
>>123
それを言うならヘッダファイルジャマイカ?

125 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:09:22 ]
C++相談室どこいった?

126 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:15:35 ]
落ちた

127 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:23:18 ]
996レスくらいだっけ? ぎりぎりで落ちたよね。

128 名前:デフォルトの名無しさん [2008/01/11(金) 18:31:41 ]
イテレータって何ですか?


129 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:03:45 ]
>>124
ヘッダもだけどライブラリじゃなくてか?

130 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:06:44 ]
shared_ptrはもう導入しないでどうするという感じだな
天才が作ってるうえアフォな質問にも丁寧に答えてくれるしな
boostの問題はライブラリによってサポートに差があることかな

131 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 19:18:34 ]
>>130
次期 C++ で導入されるよ

132 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:05:28 ]
TR1に入ってるものは全部C++0xで標準に入るんだよな。
shared_ptr weak_ptr bind function mem_fn type_traits...

133 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 20:09:01 ]
regex とか random とか tuple とかも入るよ。
んで、auto_ptr は deprecated になる。



134 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:01:32 ]
>>117
まぁ そうですね。clear()呼べば済む話ですもんね
お騒がせしました。

135 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:06:37 ]
auto_ptr、deprecatedになるのかw
カワイソス
strstreamみたいな感じか

136 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:16:13 ]
破壊的だと使い勝手悪いしなあ。

137 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:30:29 ]
コンテナに入れられないのがよほど致命的なんだろ。

138 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 21:32:59 ]
致命的過ぎるよなー、それ。

139 名前:デフォルトの名無しさん [2008/01/11(金) 22:07:12 ]
>>129
いやぁ,shared_ptr だけならヘッダファイルだけ
もってくればつかえるとオモタ.

140 名前:デフォルトの名無しさん [2008/01/11(金) 22:08:03 ]
で auto_ptr の直接の代わりは scoped_ptr ?

141 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 22:28:42 ]
そんなもん使わずに shared_ptr 使えって事だ。

142 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:06:56 ]
auto_ptrはreleaseできるのが地味に便利

143 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:09:13 ]
参照カウンタのオーバーヘッドを気にしてしまう人もいるんじゃないか たぶん




144 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:16:19 ]
boost::ptr_vectorは地味に便利だ

145 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:16:32 ]
unique_ptrが楽しみ

146 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 23:24:31 ]
参照カウンタ込みで new できるとオーバーヘッドも小さいんだが。
汎用的に作れないもんかね。

147 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 00:04:47 ]
>>146
intrusive_ptrではだめなの?

148 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 00:13:08 ]
>>147
使うために色々と必要な事があるからなあ。

149 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:04:36 ]
multimapのいくつかの要素を述語を使って消去したいのですが
何か良い方法はありますか?

bool pred(pair<int, int> v)
{
return v.first == 3 && v.second == 'c';
}

int main(int argc, char* argv[])
{
multimap<int, char> m;
m.insert(make_pair(1,'a'));
m.insert(make_pair(2,'b'));
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'c')); // 消去したい
m.insert(make_pair(3,'d'));
m.insert(make_pair(4,'d'));

m.erase(???);

return 0;
}


環境はVC8です。

150 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:05:36 ]
149です。
bool pred(pair<int, int> v)
のところは
bool pred(pair<int, char> v)
の間違いでした。
お願いします。

151 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:14:10 ]
イテレータとfor_eachじゃね?

152 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:38:42 ]
>>151

Effective STL Item9 や JosuttisのSTL本にも載ってるけど
こんな感じだろうか。

bool pred(const pair<int, char>& v)
{
 return v.first == 3 && v.second == 'c';
}

for(multimap<int, char>::iterator it = m.begin(); it != m.end(); )
{
 if( pred(*it) ) {
  m.erase(it++);
 }
 else {
  ++it;
 }
}

試してはいない。

153 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 20:52:44 ]
>>152
begin()とend()じゃなくて、lower_bound()とupper_bound()の方がいいと思う。



154 名前:149 mailto:sage [2008/01/13(日) 20:56:22 ]
>>152
お示しの方法でうまくいきました。

>151,152
ありがとうございました。

155 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:39:07 ]
>>152
折角mapなのに全検索は勿体無くねぇ?

156 名前:149 mailto:sage [2008/01/13(日) 21:47:11 ]
>>153
lower_bound()とupper_bound()
にするのは速度的な問題でしょうか?

しかし、キーを二回余分に渡すのもちょっと面倒ですね。

>>152
一旦キーでマッチしたものを、すべてシーケンスコンテナに入れて
そこからさらに絞り込むっていう方法も考えていたんですが
今、私が書いているコードで使う要素数が多くても3個ほどなので
あまり変わらないような気がしました。
要素が多いとまた変わってくるかもしれません。


157 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:04:28 ]
>>153 >>155
確かに。multimapだった。
equal_range()でイテレータの組を取ってもいいか。

>>156
全部の要素をlinerで舐めるのは非効率だわ。
上の人たちが言ってるやり方が効率が良い。


158 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:06:48 ]
upper_boundとlower_boundは大小の順にソートシーケンスに
適用するアルゴリズムだ。

std::mapはデフォルトでキー順に既に要素を挿入した時点で
ソートされているのでまさに効率の良い方法。

Cで言うとbinary_search()な。

159 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 22:13:59 ]
>>156
KeyとValueの両方の条件で削除要素を決定するなら
汎用性を考えた場合、Linerになるけど全部舐める
しかないかもな。まあ、今の場合は削除対象を絞る
条件がKeyが3に固定されてるからいいけど。

160 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 23:31:50 ]
>>156
149の通りの条件なら、Key == 3 の範囲をequal_rangeで得て、
その範囲に対して Value == 'c' を消してまわるのが速そう。平均的には、ね。
総要素数に対してequal_rangeの範囲が無視できるだけ小さいならおk。

実際に行いたい条件が149と違う場合は話が違ってくる。
Keyが単一とは限らないとか。...って、>>159に書いてあるか。


161 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 10:47:18 ]
そういえばmultimapってどういう用途に使ってますか?
mapは連想配列の様に便利に使ってますが
multimapという道具の使い方がいまいち思い浮かばない…。

162 名前:デフォルトの名無しさん [2008/01/14(月) 11:02:35 ]
得点が0〜100点で、名前を要素とする
同一得点は存在するからマルチ

163 名前:161 mailto:sage [2008/01/14(月) 11:07:45 ]
>>162
なる。 70点取った人を羅列その他できますね。 サンクスです



164 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:23:23 ]
>>161
辞書

165 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:25:39 ]
STL限定なら別だけど辞書ならbimapの方がよくね?

166 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 11:48:17 ]
用途の話しだ

167 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:18:36 ]
「ようとのはなししだ」ですか?

168 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:33 ]
>>167
辞書引け

169 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:19:40 ]
とりあえず度数分布表以外にも例挙げてよよよ

170 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:21:26 ]
>>168
辞書ならbimapの方がよくね?

171 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 13:22:53 ]
用途の話だ。

172 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:46:33 ]
>>162
この例で、0点のダメ男君が何人いるかと、
その名前の列記とかってどうやって出力するの?
mismatch()とか使うのかな。
foreachループでフラグ立てながらは勘弁

173 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 16:59:41 ]
俺ならequal_range



174 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 02:04:41 ]
割と典型的なequal_rangeの出番だと思う。
人数だけが知りたい場合は、countがいいかな。もちろんメンバ関数のほうね。

175 名前:172 mailto:sage [2008/01/15(火) 11:07:03 ]
>>173-174
ありがとうございます。 equal_range、及びcount便利ですね。

説明読んでて、「該当者のいる得点一覧」(無重複の使用キー一覧)の方法に
ぶちあたった。 もうちょい調べてみます。






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

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

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