- 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 以降
- 652 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:19:14 ]
- >>651
原書を読み漁ったおれもいますよ。平易な英語だから無問題。
- 653 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:24:52 ]
- Vandevoorde も忘れないでね。
- 654 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:38 ]
- >>653
TemplateならあるがSTLの本なんて書いてたっけ?
- 655 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:56:21 ]
- お前ら日本語でしゃべれ
- 656 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 02:11:51 ]
- よし今回だけだぞ
- 657 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 07:54:08 ]
- >643 の方法だとstd::stringには効果無いのですが、
stringの場合は明示的にメモリ解放する手段て無いのでしょうか?
- 658 名前:657 mailto:sage [2008/02/11(月) 08:06:11 ]
- すみません、VC2005のstd::stringだと、作成した
直後の状態である程度のバッファが確保されてるだけでした。
- 659 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:50:34 ]
- STLにTStringListみたいなのありましたっけ?
やっぱ、 >std::vector <std::string> ですか?
- 660 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 09:53:14 ]
- >>659
うん。 TStringList という名前だけ見ると、どちらかといえば std::list<std::string> かと。
- 661 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:03:11 ]
- 有難う。
実は、vectorしか使ったことないのです。listとvectorの違いを知りたいです。
- 662 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 10:06:33 ]
- 事故解決しました。
記述は大差ないみたいですね。 実行効率とメモリの違いみたいな。 ttp://ml.tietew.jp/cppll/cppll_novice/article/269
- 663 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 13:05:03 ]
- 大差ある。
- 664 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:07:51 ]
- vector
ランダムアクセス可能。 メモリが連続している。 list ランダムアクセスできない。 当該要素のerase以外で参照・イテレータが無効化されない。(個人的にはこれが一番重要) 任意位置への挿入・削除が定数時間。 独特な操作(spliceなど)がある。 選択する上で気をつけるのはこんなとこか?
- 665 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 17:20:05 ]
- なるほど、どうも有難うございます。
選択って意味では、 vector と list を間違えるより、 vector と map(←これもまだ使ったこと無いw) を間違えたら大変な気がしました。
- 666 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 18:24:34 ]
- いや、vector使うつもりでlistつかうよりmap使った方が多分マシだぞ
- 667 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 19:46:00 ]
- そもそもコンテナに何を求めているかによる。
連続性が重要ならlistもmapも同じくらい散々な目に遭うし、一応コンパイルが通ればいいだけなら vectorでもmapでも問題ない。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 21:59:15 ]
- ポインタつなげて線形リンクリスト作らされたことってないの?
- 669 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:17:35 ]
- >>668
標準ではないがstd::slistってのがある。
- 670 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 22:56:57 ]
- >>669
std::listだって線形リンクリストでしょ。双方向であるというだけで。
- 671 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:50:44 ]
- std::list って単方向じゃなかったけか?
- 672 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:53:08 ]
- いいえ。
- 673 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:53:10 ]
- あ、ごめ。双方向だった・・・
よく考えたら reverse_iterator 使えるもんね。
- 674 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:14:36 ]
- 連続性が要らないなら、vectorよりdequeつかっとけって誰かえらいひとが
言ってた気がする
- 675 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:36:37 ]
- 要素数が万単位にならなければlistよりvectorつかっとけって誰かえらいひとが
言ってた気がする
- 676 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:41:25 ]
- つ www.codeproject.com/KB/stl/vector_vs_deque.aspx
- 677 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 03:13:20 ]
- >>676
dequeメチャメチャ速いやん
- 678 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 03:35:20 ]
- むしろvectorがいらない子だろう
- 679 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 07:49:19 ]
- オブジェクトのサイズ/要素数が大きくない場合
listはvectorに比べてアロケーションの多さと断片化が弱点になりそうだよね
- 680 名前:666 mailto:sage [2008/02/15(金) 08:45:44 ]
- なるほど、今までvectorのみ使ってましたがmapにトライしてみます。
というより、実はネットで拾ったライブラリがmap使ってて、初期化宣言見ただけで”えっ”と思ってもう理解するの必須。 vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね? 何度も文献とかで確認しましたが、結局怖くて1つ1つイテレーター参照してますが。 ところで、map使うとプライマリキーみたいなのが必須ですよね? キーがいる場合にはピッタリですが、開発途中でやっぱキーいらね、とかなったら、 とりあえず連番で埋めとけば良いわけですかね。 その時点でvectorかlistに差し替えかな。 >>668 線形リスト勉強しました。その頃C++どころかC初心者だったため、氏にました。 で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。
- 681 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:46:35 ]
- ↑
>666 は間違いで、665です。
- 682 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 09:04:18 ]
- mapについてそんなふうに思ってる人は始めて見たw
データベースみたいな複雑なものじゃなくてただの写像ですよ。 電話帳みたいな何かと何かの対応表だと思えばいい。 パフォーマンスに関してはそれを理解してからでいいと思う。 >vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね? 多分大丈夫だけどやる必要ないならやらないに越したものはない。 >その時点でvectorかlistに差し替えかな。 パフォーマンス以前に用途が違うのでそのとおり。 >で、STLって何て便利なんだろう(これで使い方さえもう少し簡単であれば)って思ってまつ。 便利さを追求した結果こうなったんだろう。 ただしその上で、できるだけ簡単にはなってると思う。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 09:56:51 ]
- mapなんて連想配列ですよ。awk使いの私が言うんだから間違いありません。
>>vectorの連続性って、普通の変数配列みたいにメモリがばっとコピーしても大丈夫なんですよね? 多分じゃなくて大丈夫だけど、memcpy()などを自分で使うのはお勧めしない。潜在的なバグの原因になりかねない。 APIに渡すなどのように、必要に迫られたときに限定した方がいい。
- 684 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:18:40 ]
- boostとかにTStringListに近いものがあったりしないでしょうかね?
- 685 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:38:33 ]
- そんな無駄なものはない
- 686 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:39:27 ]
- ま、StringListクラス宣言して、中の人にmultimapすれば、自分でメソッド作るだけですか。
車輪の再開発とか言われたら嫌だから、既にあるものをなるべく使いたいです。
- 687 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:40:46 ]
- コンテナに使われている例えば連想コンテナのデータ構造(平衡二分木)とか
に詳しい人いる?
- 688 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 10:42:54 ]
- >686
どんなことがやりたいの?
- 689 名前:686 mailto:sage [2008/02/15(金) 10:55:33 ]
- どちらかというと、やりたいことがあるのでなくて、移植作業のためにTStringListメソッド実装。
CommaTextの入出力、iniファイルの1行処理のためのValues/Namesプロパティ、IndexOf、ファイル入出力メソッド、要素文字連結 etc..
- 690 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 11:11:00 ]
- >>687
ここにそれなりに詳しく書かれてるよ ja.wikipedia.org/wiki/%E8%B5%A4%E9%BB%92%E6%9C%A8
- 691 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 11:29:40 ]
- >>689
組み合わせて使えばできそうな気がする。 boost.lambda boost.string_algo boost.tokenizer ファイル入出力はfstreamとalgorithm使えばよし。
- 692 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 12:48:59 ]
- typedef vector<int> vector_int;
を typedef deque<int> vector_int; に書き換えただけで、うちのソフトの体感速度が上がったw 処理速度アップ!ってバージョンアップ唄えるお( ^ω^)
- 693 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:02:15 ]
- >typedef vector<int> vector_int;
>typedef deque<int> vector_int; kwsk 何が違うのか教えれ!
- 694 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:09:15 ]
- vectorに数万とかpush_backして再アロケートが発生しまくったんじゃないかと予想
- 695 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:11:54 ]
- その2つはメソッドは同じなの?
- 696 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 13:13:34 ]
- バッファの連続性が必要なくて、
確保すべきメモリ量が事前によく分からないなら、 vector より deque の方が圧倒的に効率的。
- 697 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:07:45 ]
- いままでboost::shared_ptrのコンテナにstd::listを使ってたけど
std::dequeにしたら速くなるのかな でもスマポのコピーは時間かかりそうだな...
- 698 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:11:04 ]
- push_back のコストは list より deque の方が平均的には少ないはずだが
- 699 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:16:41 ]
- mapってシーケンシャルアクセス、かつ、入れた順番に取り出す、もできますか?
- 700 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:18:42 ]
- もっと詳しく
- 701 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:20:57 ]
- mapをbeginからendまで参照した場合、
順番は、mapに登録した順番になっててくれますか?
- 702 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:23:46 ]
- >>699
入れた順番は失われる
- 703 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:24:29 ]
- >>701
Sort Criterionによる
- 704 名前:699 mailto:sage [2008/02/15(金) 14:27:50 ]
- >Sort Criterionによる
kwsk ググっても出ません。
- 705 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:30:43 ]
- map<string, int> m;
m["foo"] = 0; m["bar"] = 1; と、 map<string, int> m; m["bar"] = 1; m["foo"] = 0; で異なる挙動になるようにしたいって事だろ? 標準のmapではどうやっても不可能だと思う
- 706 名前:699 mailto:sage [2008/02/15(金) 14:35:07 ]
- え”〜ショック。
つまり、並び順が保障されるのは、vectorとdequeだけですかぁ。
- 707 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:37:31 ]
- だってmapはシーケンスコンテナじゃないし
- 708 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:42:34 ]
- >>704
テンプレートパラメータかオブジェクトととして渡す ソート基準による。
- 709 名前:699 mailto:sage [2008/02/15(金) 14:47:40 ]
- じゃ、mapはやめて、vectorします。
vectorのヘルプ見てると、pos番目の要素をとるには[pos]ではなくて、at(pos)を使えと書いてありますね。 atを使わずに[]を使ってると、dequeに置き換えが出来なくなるわけでしょうか?
- 710 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:48:47 ]
- operator[]は範囲チェックをしないけどatはする
違いはそれだけ dequeにもoperator[]はあるから、その心配は要らない
- 711 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:19:32 ]
- ごめん。未だに
「Associative Containerじゃ駄目なんですか。じゃあSequenceにします」 が簡単に出来る場面というのが想像できない
- 712 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:29:56 ]
- 線形探索しても痛くないときとか
- 713 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:07:05 ]
- >>695 >>709
>>676のリンク先にも書いてあるけど、vectorとdequeのメンバ関数の違いは ・vectorにだけある……capacity() reserve() ・dequeにだけある……push_front() pop_front() だけ。 いずれもメモリの連続性に関わるもので、前者が「あらかじめ確保しておく」系(dequeには要らない)、 後者が「先頭要素を出し入れする」系(vectorには高コスト過ぎ)。
- 714 名前:695 mailto:sage [2008/02/15(金) 17:11:30 ]
- サンクス。
STLってキモカワイイね。
- 715 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:31:49 ]
- 個人的にはlistがいらない子のようなきがしてます
- 716 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:40:48 ]
- dequeにはspliceが無いだろ?
- 717 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:46:29 ]
- listはアロケータさえちゃんと作れば、本当はやれば出来る子
- 718 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:54:59 ]
- vectorはお金がかかる子。
vector(笑)
- 719 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:11:05 ]
- vectorとdequeの最大の違いは、stackコンテナでdequeがデフォルト
コンテナとして使われてることを見ればわかるね。メモリ構造の違い によってvectorは要素を削除した場合に絶対にメモリを解放しないが dequeはチャンクの集まりだから不要なチャンクは解放されることが多い。 (これはstandardでは求められていないらしいが) また、reallocateの際、vectorは全ての要素を移動する必要があるが dequeは必ずしもそうはならない。同じ要素へのアクセスではvectorの ほうが理論的には高速。dequeはメモリ構造上indirect accessとなるから。 このくらいしか気にしてないけど、結局は要素数と実測で決めることにしてる。
- 720 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:04:47 ]
- >>706
次期C++ではinsert(iterator, value)の意味が変わって、 同順の要素の間で好きな場所に値を挿入できるようになる。 それまではstd::map<Key, std::deque<T> >でも使うしかないね。
- 721 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:27:40 ]
- >>720
へぇ。知らなかった。 これか。 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#233
- 722 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:04:14 ]
- メタプログラミングをゴリゴリやってる奴いないの?
STLを専ら使うだけ?
- 723 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:18:21 ]
- >>722
それはboostスレで。
- 724 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:16:37 ]
- C++/TemplateMetaProgramming専用スレってないの?
- 725 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:27:05 ]
- ないね。
欲しければ立てれば?
- 726 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:42:44 ]
- 過疎りそうだけどな
TMPと言ったって大概はSTL、Boostの範疇だし
- 727 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:45:39 ]
- r、ノVV^ー八
、^':::::::::::::::::::::::^vィ 、ヽ l / , l..:.::::::::::::::::::::::::::::イ = = |.:::::::::::::::::::::::::::::: | ニ= 724そ -= |:r¬‐--─勹:::::| ニ= な れ =ニ |:} __ 、._ `}f'〉n_ =- ら で -= 、、 l | /, , ,ヘ}´`'`` `´` |ノ:::|.| ヽ ニ .:. も ニ .ヽ ´´, ,ゝ|、 、, l|ヽ:ヽヽ } ´r ヽ` .ヽ げ き 724 ニ. /|{/ :ヽ -=- ./| |.|:::::| | | ´/小ヽ` = て っ な =ニ /:.:.::ヽ、 \二/ :| |.|:::::| | / ニ く. と ら -= ヽ、:.:::::::ヽ、._、 _,ノ/.:::::| | /| = れ.盛 -= ヽ、:::::::::\、__/::.z:::::.:| |' :| ニ る り =ニ | |:::::::::::::::::::::::::::::::::::.|'.:Y′ト、 /, : 上 ヽ、 | |::::::::::::::::::::::::::::::::::::_:::::_::| '゙, .\ / ヽ、 | |:::::::::::::::::::::::::::::::::::.|:::::::|.ト、 \ / / 小 \ r¬|ノ::::::::::::::::::::::::::::::::::::::::::::::::| \
- 728 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:46:16 ]
- 724だけど、立てたぞ。
pc11.2ch.net/test/read.cgi/tech/1203133502/
- 729 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:03:50 ]
- >>726
甘いな
- 730 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:04:09 ]
- TMPとSTLって全然ちがくね?
- 731 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:10:33 ]
- どっちかっつーと、非 STL 部分の方が TMP っぽいな。
char_traits とか。
- 732 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 20:53:06 ]
- iterator_traits
- 733 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:54:48 ]
- numeric_limits
- 734 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 22:55:47 ]
- std::advanceもTMPっていっていいの?
- 735 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 23:00:21 ]
- いいんじゃね?
- 736 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:45:21 ]
- vectorやdequeってさ、変更せず読み込みだけなら複数スレッドからアクセスしても
大丈夫ですか?
- 737 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 13:49:27 ]
- volatileつけとけ
- 738 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 14:49:07 ]
- 誰も書かないならvolatileいらない
- 739 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 15:05:58 ]
- 例えばVisual C++ならここに書いてある。ほかは知らないけど。
msdn2.microsoft.com/ja-jp/library/c9ceah3b(VS.80).aspx
- 740 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:53:30 ]
- MFCやVCLにある、StringOfChar って無いですか?
ある文字を指定個数分返してくれるメソッド。
- 741 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:08:12 ]
- string s(10, 'A');
- 742 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:09:32 ]
- thx! >>741
あやうくfor文で回すところですた。
- 743 名前:デフォルトの名無しさん [2008/02/18(月) 18:28:13 ]
- >>731
STLの中でメタプログラミングの要素があるのは iterator_traitsとiterator_tagを使ったディスパッチくらいかな。
- 744 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:33:37 ]
- >>743
関数テンプレートのオーバーロードを利用した ランダムアクセスとその他の振り分けか。 でもほとんど使ったことないなあ。
- 745 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:36:19 ]
- Vectorで、5番目の要素の次にデータを挿入したいときは、どう書きますか?
- 746 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:43:45 ]
- 直接は使わなくても、advance とかで間接的には使ってる事ない?
- 747 名前:745 mailto:sage [2008/02/18(月) 19:44:02 ]
- 既存の要素が4の場合と5の場合と、場合分けして、記述する必要があるのでしょうか?
- 748 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:46:41 ]
- 既存の要素が1とかの時どうすんの?
- 749 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:07:40 ]
- >>745
std::vector なら v.insert(v.begin() + 5, value); とかかな。要素数が最低5個は存在してないとマズイから。 v.size()で要素数調べる必要はあるか。 >>746 そういう意味では使うこともあるなあ。 本では読んだけど自分で書いたことはないな。
- 750 名前:745 mailto:sage [2008/02/19(火) 08:35:45 ]
- >v.begin() + 5
あ、イテレーターって足し算できるんですね。 勉強になりました。
- 751 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:13:44 ]
- vectorのイテレータはランダムアクセス可能だからな。
- 752 名前:745 mailto:sage [2008/02/19(火) 11:15:48 ]
- では、vectorのイテレータだけが、+−演算子定義されてるってことですか?
(dequeは無理と)
|

|