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 以降
191 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:47:14 ] 標準化委員会はSTL自体が「失敗作だった」って 認めてたぞ
192 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:50:21 ] 標準化委員会はC++自体が「失敗作だった」って 認めてたぞ
193 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 04:45:29 ] 親は>>192 自体が「失敗作だった」って 認めてたぞ
194 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 11:11:11 ] 俺は「性交作だ」って聞いた
195 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 11:40:21 ] おあとがよろしいようで
196 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:20:17 ] 100個ぐらいの文字列を入れて そのなかで一番出現率が高い文字列を探すには STLのどんなデータ構造とアルゴリズムをつかえばいいでしょうか?
197 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:43:38 ] まず服を脱ぎます
198 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:44:07 ] 次にソートします
199 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:48:02 ] かぜひきました
200 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 20:51:58 ] 相当大変な事態ですね。
201 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:02:46 ] 手術は成功です
202 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:25:40 ] そーっとしておいてくださいね
203 名前:デフォルトの名無しさん [2008/10/28(火) 21:27:19 ] 真面目な解答お願いします
204 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:32:40 ] std::map<string,int>で出現頻度数えれば?
205 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:36:06 ] 質問です。 struct a { func() {} }; struct b { vector <a> va: }; とあって、for_eachアルゴリズムでva内のfuncを呼び出すには どのような書き方をすればいいのでしょうか?mem_fun_refと bind2ndを組み合わせるのでしょうか?
206 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 21:44:53 ] 自己解決しました。mem_fun_refだけでいいようです。
207 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:11:52 ] >>204 連想配列ですよね?stringがキーでintが値ってことですか?
208 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:14:09 ] hash
209 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:17:42 ] map<string,int> mとすると、m[str]++としてあとはソートなりなんなりすりゃいい
210 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:30:23 ] map<string,int> test; test["hoge"]++; sort(test.begin(), test.end(), greater<int>()); こうですか?
211 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:40:03 ] mapってソートできないだろ 挿入した時点でキーで自動的にソートされてるんだから 全部要素を挿入したらvectorにでも全要素をコピーして 今度はint基準でソートすればよい
212 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:41:26 ] なるほど。どうりでコンパイルが・・・ ちょっとやってみます
213 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:43:39 ] vectorにキーと値の構造体をコピーするんでしょうか? 最大値を知りたいのではなく、最大値をとるキーをしりたいんです
214 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:51:17 ] 脳味噌を使え脳味噌
215 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:55:46 ] 何か汚ねえなあ・・・lambdaを使わないとやっぱ綺麗に書けんわ struct Comp : public std::binary_function<std::pair<std::string, int>, std::pair<std::string, int>, bool> { bool operator()(const std::pair<std::string, int>& v1, const std::pair<std::string, int>& v2) const { return v1.second < v2.second; } }; void print(const std::pair<std::string, int>& v) { std::cout << "string = '" << v.first << "', count = " << v.second << std::endl; } int main() { std::map<std::string, int> msi; std::vector<std::pair<std::string, int> > vsi; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["abc"]++; msi["def"]++; msi["def"]++; msi["ghi"]++; msi["ghi"]++; msi["ghi"]++; msi["ghi"]++; for (std::map<std::string, int>::iterator pos = msi.begin(); pos != msi.end(); ++pos) vsi.push_back(std::make_pair(pos->first, pos->second)); std::sort(vsi.begin(), vsi.end(), Comp()); std::for_each(vsi.begin(), vsi.end(), print); }
216 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:58:14 ] わざわざmapにするいみあんの?
217 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 22:59:29 ] なんか複雑ですね・・・ ちょっと解読してみます
218 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:01:17 ] >>216 挿入が楽 それだけ
219 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:03:53 ] ああ強いて言えば挿入が速いか・・・
220 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:04:51 ] 「一番」出現頻度高いのが欲しいだけなら、わざわざソートまでする必要なかろ O(n)で済むぞ
221 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:05:45 ] >>220 えっとどうするんですか?
222 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:07:06 ] mapに突っ込んだ後で、単に全舐めすりゃいいだろ シークエンスの最大値を求めるのにいちいちソートするのか?お前さんは
223 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:09:36 ] まあそうだな イテレータを回すだけ 最大値が知りたいだけならそれでいい
224 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:11:33 ] まあただ最大値の文字列の候補が複数あった時は少々工夫が必要か
225 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:12:10 ] 最大値にタイがある場合も考慮せにゃならんな 単純でいて意外と深いのかもしれないw
226 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:17:42 ] int main(){ string str; map<string,int> test; int maxval=0; int maxkey; test["hoge"]++; test["hoge"]++; test["huga"]++; map<string, int>::iterator itr = test.begin(); map<string, int>::iterator itrEnd = test.end(); while(itr != itrEnd){ itr++; } } こうしたんですが、値自体はどうやって参照するんですか?
227 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:21:00 ] itr->second
228 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:23:12 ] ああそうかpairのコンテナなんですよね
229 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:25:51 ] int main(){ string str; map<string,int> test; int maxval=0; string maxkey='\0'; test["hoge"]++; test["hoge"]++; test["huga"]++; map<string, int>::iterator itr = test.begin(); map<string, int>::iterator itrEnd = test.end(); while(itr != itrEnd){ if(itr->second >maxval){ maxval = itr->second; maxkey = itr->first; } itr++; } cout << "maxkey:" << maxkey << endl; } コンパイルはできるんですが、とまります・・・
230 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:27:09 ] >>224-225 そうなんですよね。その辺は工夫でできそうです
231 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:29:41 ] タイを考慮しても2回舐めればいいだけだから、たいした問題ではないか なんちって
232 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:30:49 ] タイがあっても3つ以上はことはないとおもうんで、大丈夫そうです。 しかし動かないです・・・
233 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:34:12 ] >>229 >string maxkey='\0'; が良くない。これはstring maxkey=NULL; と同じ意味になる。 つまりアドレス0をアクセスする文字列で初期化しようとする。
234 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:35:44 ] 基本からやった方がいいんじゃ・・・
235 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:37:58 ] >>233 if文内で代入するので問題ないかと思ったんですが・・・ >つまりアドレス0をアクセスする文字列で初期化しようとする。 ??
236 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 23:38:35 ] 微妙に誤解を招きそうなので訂正 ×つまりアドレス0をアクセスする文字列で初期化しようとする。 ○つまりアドレス0から始まるC文字列で初期化しようとする。 処理系によっては文字列が大きすぎて止まり、他の処理系では アドレス0をアクセスするのでセグメントエラーで止まったりする。
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 ] ちなみに両端以外への挿入はイテレータも参照も無効になるから注意