[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 04/29 14:24 / Filesize : 158 KB / Number-of Response : 773
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】STL(Standard Template Library)相談室 10



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 以降

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[]使うと存在しないキーを参照しようとしたときに、
対応するキーが作られるのを知らなかったので、そこらへんの勉強をという意味です。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<158KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef