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


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

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



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






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

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

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