- 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 以降
- 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は無理と)
- 753 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:35:47 ]
- dequeもランダムアクセスイテレータなので+ - は定義されているよ
- 754 名前:745 mailto:sage [2008/02/19(火) 11:42:15 ]
- え”〜、自分vectorのみ使ってるのに、それじゃvectorはやっぱり要らない子じゃん。
- 755 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 11:46:41 ]
- +や-ができないのは、たとえばlistとかsetの双方向イテレータ。
こいつらでは、インクリメントやデクリメントを繰り返す必要がある。 そんなときはstd::advanceなんていう関数が既に用意されている、もちろんO(N)。 vectorは、要素のメモリアドレスの連続が保障されているので、 組込の配列やmallocなんかで確保したメモリと同じように使えるという点が決定的にほかと違う。 例えばC用のAPIに渡すバッファなんかにも使える。
- 756 名前:745 mailto:sage [2008/02/19(火) 11:53:08 ]
- >vectorは、要素のメモリアドレスの連続が保障されているので、
その通りなんですが、上レス読むと、やっぱふつーはイテレーター使えって逝われてるじゃん。
- 757 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:00:24 ]
- >>745-750
std::vector<int> v; if (v.begin() + 5 > v.end()) v.resize(5); を実行したら、VS2008 では Debug Assertion Failed! で落ちた。 v.end() を越えるような vector::itrator::opearator+() の結果に対して、 _SCL_SECURE_VALIDATE_RANGEマクロが範囲外を検出して例外を起こしている。 言いたいことはわかるが、融通利かせてほしい。
- 758 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:03:22 ]
- じゃ malloc的な使い方する時は、あえて
vector<int>って直書きしないとちょっと恐いな。
- 759 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:05:37 ]
- >>756
そうだから、vectorで要素へのポインタを使うのはchar*な引数に渡すなんて使い方くらいだね。
- 760 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:06:05 ]
- すまん、char*に限らず任意のT*でいいんだ。
- 761 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:13:51 ]
- >>757
組み込み配列だって要素数超える足し算は未定義動作なんだぜ。 assert() が 入ってる分ありがたいぐらいだ。
- 762 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 12:32:11 ]
- イテレータについて質問です。
イテレータをインクリメントするコストはコンテナによって違うと思うのですが、 STL解説サイトなどで、そのことについて触れているのをみかけません。 速度を知りたければ、実装毎にテストして計るしかないのでしょうか?
- 763 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:08:30 ]
- >>762
実際の速度(具体的な処理時間)を知りたいのならそれでいいんじゃね? ソースやアセンブル結果を見て見当をつけても良いけど。
- 764 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:08:44 ]
- VC++2005で、
std::map<std::string,int> mp; mp["key000"]=0; とすると、「stringに>演算子がない」ってエラーが出るんだが、これって標準C++準拠の正しいエラーなのかな? それともVC++2005のstringの方がおかしいのかな? ネットで検索した時に普通にstd::stringをキーにしてるソースあったんで、問題ない書き方だとは思うんだが。
- 765 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:13:37 ]
- >>762
折角ソースがあるんだから読めばいいんじゃね?
- 766 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:18:50 ]
- >>764
標準準拠である確信は無いけど、g++-4.2.3では普通に使えた
- 767 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:31:04 ]
- >>764
VS2005でその二行を今書いているコードにペーストしてビルドしたけど、普通に通ったよ。
- 768 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:32:00 ]
- >>764
エラーメッセージを変に略さずに、そのまま晒したり Google に放り込むと、 なにか余計なことをしているのが見つかるかもしれない。
- 769 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:38:22 ]
- ヘッダincludeしてない時に出るメッセージに似てる…
- 770 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 13:38:42 ]
- >>764 ヘッダのincludeが足りてないのでは?
#include "stdafx.h" #include <map> #include <string> ←これをコメントアウトすると、「stringに>演算子がない」ってエラーが出る int _tmain(int argc, _TCHAR* argv[]) { std::map<std::string,int> mp; mp["key000"]=0; return 0; }
- 771 名前:764 mailto:sage [2008/02/19(火) 13:45:41 ]
- 早いレスd。
#include <string>が抜けてただけでした。 お騒がせして申し訳ないです。
- 772 名前:762 mailto:sage [2008/02/19(火) 14:07:09 ]
- >>763,765
どうもです。 ソース見て見当つけるの難しいですね(if文のコストとポインタ代入のコストの比率がどのぐらいになるのかとかさっぱりです)。 c++の制御文や演算のコストについて、本などでほとんど目にしないのですが、皆さんはどうやって勉強されました?
- 773 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:20:26 ]
- >>772
環境によって違うんだから、ある程度一般化せざるをえない本なんかで「勉強」するのは 無理だろ。 速度が要るプログラム組むときに、いろんなコードに対応するアセンブリを見て経験的に 身に付けるのがいいんじゃね? 環境が変われば結果が変わるということにも気をつけないといけない。
- 774 名前:762 mailto:sage [2008/02/19(火) 14:47:14 ]
- >>773
なるほど。 経験的に身につけていくしかないですか。 速度見積もるのに技術がいる上、環境で変わることを考えると、 速度はあまり気にせず、プロファイリングしてからボトルネックとなっている部分だけ考えるのがいいんでしょうね。
- 775 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 14:55:08 ]
- ばかすぎる
- 776 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 15:00:48 ]
- 自己卑下ですか?
- 777 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:31:26 ]
- スパコンやx86-64のSSE2最適化の場合はvectorを使って、ベクトル化させたい場所はポインタに変換してる。
iteratorなんか使うと最適化してくれないし。
- 778 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 16:34:19 ]
- >>772
まあ、こういう細かい部分を気にするのは悪いことじゃないよね。 でもそれはC++の勉強ではなくて、ターゲット環境のしくみを先に勉強した方が良いよ。 CPUがC++で作ったコードをどう処理するのか、とかさ。 昔みたいにクロック数を数えれば分かるような簡単な時代じゃないけど、 その疑問に答えるためには、結局そのあたりの知識が必要だから。
- 779 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:38:29 ]
- スパコンでどんなソフト作ってんの?
- 780 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 17:59:00 ]
- >>777
やっぱり、本物の数値演算には valarray は使い物になりませんか?
- 781 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 18:00:28 ]
- 下手にC++で書くよりMatlabで書いた方が早い
- 782 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 19:57:54 ]
- >>774
理論的な計算量のオーダーだけは気にしておいた方がいい。 O(N^2)の処理をやっている場所やO(N)の処理を繰り返す場所があったら 適切なコンテナやアルゴリズムを選定することを考えるべき。 結果的にはmapやsetを使うよりvectorを毎回検索、ソートした方が 速いというケースはあるけど、チューニングする以前のエイヤッと決める段階では、 理論的に速いアルゴリズムを選んでおいた方が無難。
- 783 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:41:57 ]
- >>780
つーか、C++自体が使い物にならなったりする。 ヌパコン屋はFortranしか本気でコンパイラを使ってない。
- 784 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:42:40 ]
- >>783
×使ってない ○作ってない
- 785 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:45:54 ]
- スパコンは並列化がキモだから、
並列化コンパイラの作りやすい Fortran を作りたがるのかもね。 言語仕様も単純で作りやすいし。
- 786 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:00:50 ]
- 質問です。
vectorのイテレータが有効なイテレータかどうか調べる方法を教えてください。
- 787 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:04:23 ]
- 質問です。
ポインタが有効なポインタかどうか調べる方法を教えてください。 と同じく、ありません。
- 788 名前:785 mailto:sage [2008/02/19(火) 22:30:42 ]
- >>787
わかりました。 ありがとうございます。
- 789 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:34:26 ]
- 有効なポインタの全てと等しくならなければ有効・・・かも。
大小比較演算子使えるなら簡単になる。 当然、親となる配列が固定されていないと無理だが。 でも、こういうことしていいのかは微妙。 有効に見えるけど、指してる所が違うとかありうるし。
- 790 名前:786 mailto:sage [2008/02/19(火) 22:40:03 ]
- vec.begin() < itr && itr < vec.end()
こんな感じでやっていたのですがこれでいいのか不安でした。
- 791 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:42:01 ]
- やるなら vec.begin() <= itr かと。
それで一応どこか有効な要素は指してるかもしれないが、 「元々指していた箇所から決して動いていない」 ということまでは保証してくれない。
- 792 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:00:47 ]
- 非常に厳密に言えば>>790のコードは全く意味がない
そのコードを実行してよい事前条件が、まさに itr が有効なイテレータであることなので
- 793 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:43:39 ]
- >>790
reallocateされた場合どうすんのよ?
- 794 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 23:55:31 ]
- なんだかんだいっても、あれだよあれ。
- 795 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:12:26 ]
- メジャーリーグに興味持ち始めた頃、STL vs ATLってのがあって何かと思ったら
セントルイス・カージナルス対アトランタ・ブレーブスだった。
- 796 名前:デフォルトの名無しさん [2008/02/20(水) 09:16:18 ]
- >vectorのイテレータが有効なイテレータかどうか調べる方法を教えてください。
>vec.begin() < itr && itr < vec.end() 自分もこれに関する情報欲しい。 良い記述があれば教えてキボン!
- 797 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 09:26:21 ]
- しかしイテレータをそんな長く持ってるのって
プログラムを考え直した方がよいような
- 798 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 09:35:17 ]
- いや、長く持つんじゃなくて、取得した直後に調べたいんだけど。
- 799 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 09:36:58 ]
- *itr
で対象をproxyにしてis_valid()でも持たせたら?
- 800 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 09:44:22 ]
- そのis_validの実装をどうするかの話をしてるんだろ…
- 801 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:16:45 ]
- 盛り上がってきますたw
- 802 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:25:13 ]
- >>798
本当に「取得した直後」なら、i != vec.end()でいいのでは。
- 803 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:35:54 ]
- サンクス>>802
絶対あってる?保障してくれる?
- 804 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:09:57 ]
- >>803
どんな手段で取得した直後を想定しているの?
- 805 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:10:48 ]
- どれだけ力強く保証したって、しょせん名無しのレスだぜ。
- 806 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:12:20 ]
- こんなに調べる気ゼロな奴だと知ってたら、大嘘教えたのにな。
- 807 名前:803 mailto:sage [2008/02/20(水) 11:14:32 ]
- >>804
>>745- のような使い方です。
- 808 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:16:06 ]
- >>806
本人からすると、ここで質問することだって調べる気でしょ。 そういう破壊的なことするのは良くないお( ^ω^)
- 809 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:20:42 ]
- 答になってないぞ。
>>745に書いてあるのは「取得したあとにやりたいこと」。 質問は「どんな手段で取得した直後を想定しているのか」だ。
|

|