【C++】STL(Standard Template Library)相談室 10at TECH
【C++】STL(Standard Template Library)相談室 10 - 暇つぶし2ch752:デフォルトの名無しさん
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[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch