- 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 以降
- 643 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 19:27:10 ]
- >>642
read<short>(input) とかいう関数でも作れば良いんじゃない?
- 644 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:13:34 ]
- >>642
short header1, header2; if(input >> header1 >> header2) { // ... }
- 645 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 20:26:01 ]
- >>644
そんな餌に(AAry
- 646 名前:642 mailto:sage [2008/11/25(火) 01:57:17 ]
- >>643
こんなのを作ってみました。 template<class T> std::istream& read(std::istream& is, T& data) { return is.read(reinterpret_cast<char*>(&data), sizeof(T)); } >>644 それって、inputが文字列なら良いですが、 バイナリ読みしたい場合はダメですよね?
- 647 名前:デフォルトの名無しさん [2008/11/25(火) 16:50:03 ]
- vectorのイテレータは足し算ができるのに、listのイテレータではできないんですね。
listで添え字アクセスのようなことをやる場合は、 list<int>::iterator it = list.begin(); for(size_t i= 0; i< index; i++ ) it++; みたいなことをやらないといけないの? 挿入とか削除とかが多い配列なのでvectorよりlistを使った方がいいんですが、 indexを使ったアクセスも多いので、なんかブサイクですね。 いい方法ないですか?
- 648 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:55:04 ]
- >>647
コンテナの種類とランダムアクセスイテレータに関して も少し理解を深めといた方が。
- 649 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 16:57:49 ]
- >>647
std::advance()
- 650 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:16:49 ]
- >>648
ランダムアクセスをしたいならvectorを使うべきだと? 一般論ではそうでしょう。 しかし、 vectorの場合、挿入・削除におけるコストは配列要素の数が増えるに従って等差級数的に増大します。 listの場合は配列要素の数にかかわらずコストは一定です。 だから、配列要素の数と、挿入・削除・ランダムアクセスの頻度を考えて、 処理速度的に最適なものを選びたいと思っています。 それで私のケースではvectorよりlistが妥当だと判断した訳ですが、ソースの記述がブサイクだと言ったまでです。 >>649 listの要素の入れ替えをしたくはないのです。
- 651 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:22:20 ]
- >>650
つdeque ランダムアクセスできて挿入も速い
- 652 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:26:38 ]
- >>651
私のケースでは、挿入・削除を行う位置は先頭・末尾でないことが圧倒的に多いのです。
- 653 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 17:41:22 ]
- >>652
dequeは途中の挿入も(そこそこ)速いんだよ。 dequeの仕様を満たそうとすると、どうしてもそういう実装になる。
- 654 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:02:08 ]
- >>650
要件がいまいちつかめないので何ともいえないけど、 規格を眺めてlistが最適だと思うなら仕方がないんじゃない? listはランダムアクセス出来ないしね。 でも、std::advanceの認識からしてSTLの理解甘そうだし、もう一度規格眺めることをおすすめするよ
- 655 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:14:47 ]
- >>652
要素の連続性がいらないがアクセスがランダム性高い状態ならdequeにしとけ
- 656 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:39:03 ]
- 周りがアドバイスしても結局自分の方法に固執するんじゃ
何言っても意味ないよ そういうのはほっとくに限る
- 657 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:44:27 ]
- 挿入/削除が多いならリストを使うべきだろ
ときどきランダムアクセスが必要ならstd::advanceで
- 658 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:51:51 ]
- advanceを思いっきり勘違いしてる節があるよね
- 659 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 18:58:49 ]
- >>655
配列要素数が数万個以下の場合は、dequeよりむしろvectorの方が速かった。 VS2005でコンパイルした場合だけど。
- 660 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:05:31 ]
- >>659
何が?
- 661 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:28:06 ]
- 用途によっては挿入/削除/ランダムアクセスが全部O(log n)のデータ構造も検討するといいかもな
STLにはないけど
- 662 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:31:05 ]
- >>647より後の返答カキコ 本当に>>647なのか?
おまえら、誰かに釣られてないか? IDのない板って、なりすまし可能だからな
- 663 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 19:35:42 ]
- 質問に答えてるだけなんだから、>>647と>>650が同一人物であろうとなかろうと何も関係ない
釣りだったとしても痛くも痒くもない
- 664 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:03:28 ]
- std::vector<要素 *>
- 665 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:30:10 ]
- skip listか
んなもんわざわざ使うなら普通にlistでもいいと思うけどな
- 666 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 20:40:43 ]
- setについて質問です
www5c.biglobe.ne.jp/~ecb/cpp/07_15.html 要素の追加(追加場所をイタレーターで指定) 定数時間 とありますが、追加場所をイタレーターで指定とはどういうことですか? insert関数ではないですよね?
- 667 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:02:51 ]
- >>647はlistを使うのを前提として質問していて
listの代わりに何が良いかは質問してないようによめるのだが
- 668 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:04:52 ]
- >>666
insertのことだと思うが
- 669 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:11:14 ]
- >>666
setにはイテレータを指定するinsertと指定しないinsertがあるよ
- 670 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:15:27 ]
- vectorにそのままクラスを入れるとコピーコンストラクタを何度も呼び出してるようなので
クラスのポインタを入れて使おうかと思ってるのですが 何か注意しなければ行けない点はありますか?
- 671 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:17:35 ]
- >>670
ないです。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:18:02 ]
- あります
vectorから取り除いたときのdeleteし忘れ
- 673 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:20:48 ]
- >>670
オブジェクトの多重参照
- 674 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 21:54:32 ]
- FUGAはduobleとstringのpairです
multiset<FUGA> huga; にいくつかデータが入っています。これからある文字列(stiring)の数をカウントしたいんですがどうすればいいでしょうか? count関数がありますけど使い方が・・・ huga.count("hogehoge");みたいな感じで使いたいんです
- 675 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 22:04:16 ]
- >>674
count_if()
- 676 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:21:30 ]
- >>671-673
サンクス deleteしなきゃだったんだな ありがとう
- 677 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:50:01 ]
- >>670
ptr_vectorでも使えば
- 678 名前:デフォルトの名無しさん [2008/11/26(水) 11:06:22 ]
-
KOUZOUTAI data[100]; partial_sort( data, data + 10 ,data+100, Sortpred1) ってできますけど vector<KOUZOUTAI> data(size); partial_sort( data.begin(), data + 10 ,data.end(), Sortpred1) ができません。第2引数の書き方が問題だと思うんですが、どう書けばいいでしょうか?
- 679 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 11:18:38 ]
- >>678
data.begin() + 10
- 680 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 12:37:31 ]
- const_iterator を iterator に変換するために distance() と advance() を使う方法が
Effective STL にありますが、この方法はランダムアクセス反復子でないと定数時間で 変換できません。 std::set の const_iterator を定数時間で iterator に変換する方法はあるでしょうか?
- 681 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:34:21 ]
- typedef std::set<A,B> C
std::set<C::const_iterator,C::iterator> を作って変換しろ
- 682 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 15:46:58 ]
- >>681
std::set, std::map の検索は普通の実装で対数時間
- 683 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 18:49:39 ]
- *reinterpret_cast<std::set<A>::iterator*>(&cit)
大体の実装なら通るよ 細かいこと気にすんなってwwwww
- 684 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 20:24:23 ]
- 対数時間なら別にいいんじゃね
- 685 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:02:08 ]
- >>680
とりあえず何のためにそんな変換をする破目になったのか教えてくれまいか?
- 686 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 01:35:37 ]
- >>680
定数時間にこだわるんならどうぞ std::tr1::unordered_map<C::const_iterator, C::iterator>
- 687 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:23:23 ]
- vector<vector<T> > WArray;
WArray warr (100, vector<T>(10)); T型の2次元配列を作る場合、このようにすることが多いのだけど 全体のデータサイズは、size_of()関数で取得できるけど、配列の行数と列数のサイズ を知りたい場合、方法は無いのでしょうか?
- 688 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:44:30 ]
- > 全体のデータサイズは、size_of()関数で取得できるけど、
できるか?
- 689 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 15:57:26 ]
- >>688
>>687です ごめんなさい、間違えました size_t size = warr.size(); こうでしたね(^^;
- 690 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 16:29:30 ]
- いや、それ全体じゃないから。
- 691 名前:デフォルトの名無しさん [2008/11/30(日) 17:38:11 ]
- detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdbの解決方ありますか?
- 692 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 17:41:32 ]
- マルチ市ね
- 693 名前:デフォルトの名無しさん [2008/11/30(日) 17:45:42 ]
- detours.lib(detours.obj) : warning LNK4099: PDB 'detours.pdb' が 'C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib\detours.lib'に見つかりません。デバッグ情報がないものとして、オブジェクトにリンクします。これの意味と解決方教えてください
- 694 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 18:34:07 ]
- さっさとしね
- 695 名前:デフォルトの名無しさん mailto:sage [2008/11/30(日) 19:02:34 ]
- 大体わかるけどマルチ野郎には絶対教えない
- 696 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:08:26 ]
- こんなファイルがあって、
-- a foo FOO a fooz FOOZ a foz FOZ b bar BAR b baar BAAR -- その場合、こんな関係を現わしているんだけど、 -- a-+-foo +-fooz +-foz b-+-bar +-baar -- どんなデータ構造にするのが手頃か相談に乗ってくれまいか。
- 697 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:17:04 ]
- 何やりたいかによるだろうが、単に vector vector ではだめなの?
- 698 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:26:09 ]
- aやbがなければvector<vector<pair<string, string>>>でいけるかな。問題は、
aかb(か他の何か)を選択した後に、fooなりなんなりを選択するってユーザインターフェースがあることなんだ。 おまけに、fooを選択したときの出力はFOO(単純に大文字って事じゃないよ)でないといけないわけで。
- 699 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:31:12 ]
- mapでいいだろ
- 700 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:32:12 ]
- 楽しようと思えばmap<string,map<string, string> >かなぁ
- 701 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 00:51:58 ]
- >>698
なんかよくわからんが、vector<pair<>> を含む class を作れば いいのかな。出力もメンバ関数でもできるし。
- 702 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:17:48 ]
- multimap<string,pair<string,string>>とかかな・・・
S式にした場合に(("a" ("foo" . "FOO") ("fooz" . "FOOZ")) ("b" ("bar" . "BAR") ("baar" . "BAAR"))) みたいなのを表現したいってことなら
- 703 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 01:34:40 ]
- struct Entry {
string type, id, name; bool operator<(const Entry &a) const { return type < a.type; } }; multiset<Entry> entries; でequal_range使わせるかな
- 704 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 02:41:11 ]
- 定数時間でa->foo->FOOと引く必要あるなら、map二段構えが一番楽じゃね。
- 705 名前:696=698 mailto:sage [2008/12/04(木) 06:11:17 ]
- レスありがと。
なるほど、色々手はありそうだね。 ちょっとmultimapとmultisetを調べて、どれにするか決めるよ。 # 昨夜のうちに決めようと思ったのに眠りこけていたのは内緒w
- 706 名前:デフォルトの名無しさん [2008/12/04(木) 20:31:19 ]
- vectorを配列っぽく使ってるんですが、
eraseに渡す値はイテレータじゃなきゃ駄目なんでしょうか? vec.erase(vec[5]) vec[5].erase() みたいなことはできませんか?
- 707 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 20:34:31 ]
- begin()+5
- 708 名前:706 mailto:sage [2008/12/04(木) 20:36:56 ]
- おおー。感動です。ありがとうございました。
- 709 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:10:14 ]
- まあ使い辛いとは思うがな・・・。
- 710 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:28:47 ]
- 関数の戻り値を直接 + とか . で使えることを初めて知ったときは感動したな。
とどうでもいい回顧
- 711 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:29:42 ]
- . はともかく + は・・・。
数学的に、単独の方が違和感あると思われ。
- 712 名前:デフォルトの名無しさん mailto:sage [2008/12/04(木) 22:34:59 ]
- 右辺値やな
- 713 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:12:57 ]
- for_eachの使い方を知ったときは感動したけどやっぱり使いづらい
- 714 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 00:21:25 ]
- lambda なしに for_each だけあってもね・・・。
- 715 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 10:23:09 ]
- range adapterも欲しいナ
- 716 名前:デフォルトの名無しさん mailto:sage [2008/12/05(金) 18:00:27 ]
- rangeベースのforとアルゴリズムとlambdaだけでもwktkが止まらない
- 717 名前:デフォルトの名無しさん [2008/12/06(土) 15:46:46 ]
- deque<string> buff;
にpusu_back()は定数時間ですか?それと buff[0]みたいなアクセスはありですか?
- 718 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:32:10 ]
- 「deque push_back 定数時間」でググれば、皆同じことを言っているし、
buff[0]みたいなアクセスが「あり」かどうかは自分で書いてコンパイルすればわかると思うんだが、 何故こういう質問が書き込まれるんだろう。 あと、「みたいな」っていうのがよくわからん。 それ自体だけでなく「それとはちょっと違う何らかのアクセス方法」も込みで訊ねてるのなら、 その内容次第で返答は変わるかもしれないから、もうちょっと具体的に書くべき。 もし、自分の表現に対する自信の無さゆえに「ぼかし」を加えたに過ぎないなら、 そういうのはただ単に答えにくくなるだけだから、やめたほうがいい。 答を書かないことも含めて、親切すぎて逆切れされる可能性大だな、このレス。
- 719 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:39:40 ]
- >>718
そんなのはいいから答え教えろかす
- 720 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:46:12 ]
- 長々となに書いてんだろ PC触りすぎて酸素欠乏症なのかな
- 721 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 16:49:17 ]
- std::dequeはrandom access containerとback insertion sequenceの要件を満たしているので
operator[]によるrandom accessが可能かつ、 push_backによる要素追加は償却で定数時間であることが保証されています
- 722 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 17:45:09 ]
- >>720
> 長々となに書いてんだろ 馬鹿が読むと煽りたくなるアドバイスじゃない?
- 723 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:13:35 ]
- むしろpush_backが償却定数時間よりひどいコンテナなんて無いだろw
- 724 名前:デフォルトの名無しさん mailto:sage [2008/12/06(土) 18:18:33 ]
- これらの操作を提供するための条件として規定されてるからね。
- 725 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:15:49 ]
- set とかは insert だしな。
- 726 名前:デフォルトの名無しさん [2008/12/09(火) 14:44:05 ]
- vectorの2次元配列はどうすればいいんですか?
2次元目も動的にしたいんです
- 727 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 15:04:51 ]
- vector<vector<int> > v;
- 728 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:27:55 ]
- ありがとっ
- 729 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:01:36 ]
- これって問題ある?
class CVector { vector<int> A; } vector<CVector> B; CVector.A.resize(10); B.resize(10);
- 730 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:03:22 ]
- class CVector
{ vector<int> A; }←セミコロンがない vector<CVector> B; CVector.A.resize(10);←クラス内の動的メンバへのアクセス方法がおかしい B.resize(10);
- 731 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:21:46 ]
- あそうか、こうしないとインスタンスが作れなかった
class CVectorSub { public: vector<int> A; }; class CVectorMain { public: vector<CVector> B; }; class C { public: CVectorSub vSub; CVectorMain vMain; void Resize() { vSub.resize(10); vMain.resize(10); } };
- 732 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:24:20 ]
- やばい
2次元配列じゃなくなってる 意味ねぇ
- 733 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:39:28 ]
- あ!わかったthx!
class CVectorSub { public: vector<int> A; }; class C { public: CVectorSub vSub; vector<CVectorSub> vMain; void Resize() { vSub.A,resize(100); vMain.resize(10); } };
- 734 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:44:36 ]
- うわ・・・これダメだ
- 735 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:45:35 ]
- >>733
vSubを操作してもvMainに影響しないし、vMainを操作してもvSubには影響しない。 わかってるならいいんだけど。 エスパーすると vector<vector<int> > vec; vec.resize(10); for(int i=0; i!=vec.size(); ++i) { vec[i].resize(10); } なんじゃないかと。 違ったら無視して。
- 736 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:56:13 ]
- いやそれです。ありがとう
それだと全部同じ配列数になるのかと思ってしまった。 vec[0].resize(10); vec[5].resize(20); こう出来たんだ。 暴れてしまった・・・すまんTHX
- 737 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:12:04 ]
- 2次元配列の初期化とポインタの使い方あってますか?
vector<vector<int>> vec(5, vector<int>(100, 0)); vector<vector<int>>* pVec = vec; pVec[3]->resize(200); pVec[3][180] = 12345;
- 738 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:33:26 ]
- いいえ。
- 739 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 11:37:41 ]
- >>737
> vector<vector<int>> まずこれがだめ。正しくは vector<vector<int> > 2行目はコンパイル通らない。 3行目と4行目も意味がめちゃくちゃ。
- 740 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:27:03 ]
- ポインタをインデクサで参照して実態をアロー演算子で参照してるがな
大体はそんな流れでいいと思うが後は実際にビルドしてみるよろし つーか何でポインタが出てくんの?w
- 741 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:35:38 ]
- 何がしたいかよく分からない例だが
そのまま直すとこんな感じか vector< vector<int> > vec(5, vector<int>(100, 0)); vector< vector<int> > *pVec = &vec; (*pVec)[3].resize( 200 ); (*pVec)[3][180] = 12345; しかしvectorに直接vector入れたらりサイズのコストがやばそうだな^^;
- 742 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 12:44:08 ]
- ありがと。
本2冊読んで> >の間のスペースがわからないのがやばい vector<vector<int> > vint; vector<vector<char> > vchar; ごめん↑を分岐なしで使えるようにするためにポインタに入れたかったんだけど vector<vector>* pvec = char; ここの書き方がわからないお願い!
- 743 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:06:59 ]
- そこでテンプレート関数の出番ですよ
main() { vector< vector<int> > vint; vector< vector<char> > vchar; if(〜〜〜) test(vint); else test(vchar); } templete<class T> test(T &vector) { vector[3].resize(200); vector[3][180] = 12345; } 適当に書いたから間違ってるかも分からん
- 744 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:27:33 ]
- >>742
共通のクラスを継承してない限り、型の違いをポインタでは吸収できない。 なので>>743の方法になる。
- 745 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:40:36 ]
- いや何を書いてあるのかがわからなかった
コンテナの前にテンプレートを勉強してくる ありがと、まじありがとっ
- 746 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 13:45:38 ]
- 今更勉強するより0xまで待った方がいいかもなー
- 747 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:41:07 ]
- それは0x完全対応コンパイラを待ってから勉強するってこと?
あ、老後の楽しみか
- 748 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 06:28:40 ]
- なに微妙に興奮してんのw
- 749 名前:デフォルトの名無しさん [2008/12/12(金) 07:10:55 ]
- >>748
オ○ニーしながらだからねw
- 750 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 09:04:47 ]
- 上級者すぐるw
- 751 名前:デフォルトの名無しさん [2008/12/13(土) 01:33:45 ]
- [SourceForge.net: Project File Releases: STLport] STLport STLport-5.2.1 released (Wed, 10 Dec 2008 10:50:47 GMT) (2008-12-10 19:50)
- 752 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:34:59 ]
- 0x ってもうあと一年しか残ってないんだ
- 753 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:13:07 ]
- もしかして 09 でなくて 0xa だったりして
- 754 名前:デフォルトの名無しさん [2008/12/13(土) 12:24:32 ]
- すみません、c++のカスタムアロケータでの質問なんですが
カスタムアロケータとしてmy_allocatorを作り、 それを指定したbasic_stringを typedef basic_string<char, char_traits<char>, my_allocator<char> > my_string; と定義しました。 それでやりたいことなんですが my_string ms = "ms test"; std::string ss = "ss test"; ms = ss; と、アロケータの違うコンテナ同士で代入をしたいのです。 今はとりあえず my_string ms = "ms est"; std::string ss = "ss test"; ms = ss.c_str(); としてますが、ちょっと不恰好で気になってしまいます。 なにかスマートな方法はありますでしょうか?
- 755 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:50:12 ]
- assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());
- 756 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:04:10 ]
- おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。
- 757 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 13:19:49 ]
- ss.assign(ms.begin(), ms.end());
- 758 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 18:59:03 ]
- STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型) コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
- 759 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 19:12:31 ]
- 失敗ってどんな?
- 760 名前:758 mailto:sage [2008/12/15(月) 19:15:39 ]
- >>759 insert()したときの戻り値の.secondが必ずfalseになる
- 761 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 20:35:44 ]
- エラーが起きる最小限のソース貼ってみ
- 762 名前:758 mailto:sage [2008/12/15(月) 21:15:36 ]
- ↓にうpしときました
www3.uploda.org/uporg1858304.zip.html Passはstlです 一応環境も書いときます WinVista SP1 VS9
- 763 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:26:08 ]
- 一時オブジェクト?
- 764 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 22:45:41 ]
- >>762
ttp://msdn.microsoft.com/en-us/library/ms632679.aspx CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。 insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
- 765 名前:758 mailto:sage [2008/12/15(月) 22:46:02 ]
- ローカルのものをmapにはinsert出来ないということですか?
- 766 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:01:01 ]
- 764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて LPFUNC lpfn = hoge[ hWnd ]; で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
- 767 名前:758 mailto:sage [2008/12/15(月) 23:11:12 ]
- なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
- 768 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:12:11 ]
- >>765
つ // LPFUNC lpfn = hoge[ hWnd ]; // if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL; これでinsertは成功
- 769 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 23:18:39 ]
- わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn; でいいじゃない
- 770 名前:758 mailto:sage [2008/12/15(月) 23:25:16 ]
- 無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw
- 771 名前:デフォルトの名無しさん mailto:sage [2008/12/16(火) 12:17:45 ]
- STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
- 772 名前:758 mailto:sage [2008/12/16(火) 17:26:11 ]
- CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、 対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。
|

|