08/12/13 10:34:59
0x ってもうあと一年しか残ってないんだ
753:デフォルトの名無しさん
08/12/13 12:13:07
もしかして 09 でなくて 0xa だったりして
754:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/13 12:50:12
assert(ms.size() >= ss.size());
std::copy(ss.begin(), ss.end(), ms.begin());
756:デフォルトの名無しさん
08/12/13 13:04:10
おぉなるほど、イテレータを使えばいいんですね。
ありがとうございます。参考にして作ってみます。
757:デフォルトの名無しさん
08/12/13 13:19:49
ss.assign(ms.begin(), ms.end());
758:デフォルトの名無しさん
08/12/15 18:59:03
STLの仕様とかよく理解できてないから根本的におかしいかもだけど、
map< HWND, LPFUNC >みたいな使い方ってダメなんでしょうか。 (LPFUNCは関数へのポインタ型)
コンパイルは通るんですが、insert()すると必ず失敗してしまいます。
759:デフォルトの名無しさん
08/12/15 19:12:31
失敗ってどんな?
760:758
08/12/15 19:15:39
>>759 insert()したときの戻り値の.secondが必ずfalseになる
761:デフォルトの名無しさん
08/12/15 20:35:44
エラーが起きる最小限のソース貼ってみ
762:758
08/12/15 21:15:36
↓にうpしときました
URLリンク(www3.uploda.org)
Passはstlです
一応環境も書いときます
WinVista SP1
VS9
763:デフォルトの名無しさん
08/12/15 22:26:08
一時オブジェクト?
764:デフォルトの名無しさん
08/12/15 22:45:41
>>762
URLリンク(msdn.microsoft.com)
CreateWindowは呼び出しから戻る前にいくつかのメッセージをsendする。
insertする前にWndProcのhoge[hWnd]で要素が追加されてるから失敗する。
765:758
08/12/15 22:46:02
ローカルのものをmapにはinsert出来ないということですか?
766:デフォルトの名無しさん
08/12/15 23:01:01
764が言ってるのは、
自分でinsertを呼ぶよりも前に、WndProcが呼ばれて
LPFUNC lpfn = hoge[ hWnd ];
で、hWndに対応する関数ポインタがヌルとして登録されてしまうってことでしょ
767:758
08/12/15 23:11:12
なるほどやはり詳細な仕様を知らないで使うとへんなとこでバグになりますねー。
つまり、findでイテレータを探して、そのイテレータの指す先が有効だった場合にlpfnに代入すればいいということでしょうか。
768:デフォルトの名無しさん
08/12/15 23:12:11
>>765
つ
// LPFUNC lpfn = hoge[ hWnd ];
// if ( lpfn ) return ( lpfn )( hWnd, msg, wParam, lParam ) ? 0 : E_FAIL;
これでinsertは成功
769:デフォルトの名無しさん
08/12/15 23:18:39
わざわざエラー検査する必要ないのでは?
hoge[ hWnd ]=lpfn;
でいいじゃない
770:758
08/12/15 23:25:16
無事解決しました。>>764 >>766 >>768ありがとでした。
ちょっとSTL関係の本を探して勉強しなおしてきますw
771:デフォルトの名無しさん
08/12/16 12:17:45
STLというよりWindowsAPI、ウィンドウ生成周りの勉強だと思う
772:758
08/12/16 17:26:11
CreateWindowが幾つかメッセージ送るのは知ってたんですが、
find()使わないでoperator[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。