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 以降
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で平気。