- 1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 809 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:08:30 ]
- 参照渡しで変更させたほうがいいなぁ。
要素数一桁だとか、RVOが可能な記述が出来るならともかく。 どうしても戻り値がいい場合はshared_ptrで包む。
- 810 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:31:06 ]
- バイナリでのファイル入出力って普通のと何がちがうの?
バイナリ形式で保存したのをメモ帳で開いても普通に出力したのと変らないんだけど
- 811 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:53:33 ]
- >>799
C++ にもプロパティがあればいいんだけどね。 拡張機能で用意されてる事もあるが。
- 812 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:59:27 ]
- >>807
配列の先頭アドレスを返す、じゃダメなのかな >>810 普通のっていうのはテキストモードのことだよね テキストモードだと改行文字をいじったりしてる 詳しく知りたい場合は「fopen テキストモード」とかでググれば出てくると思う
- 813 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:15:45 ]
- C++の参照渡しって、結局中ではアドレスが渡されてるんですか?
そうじゃないとしたら一体どうなってるんでしょうか?
- 814 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:21:35 ]
- 結局中ではアドレスが渡されてる実装しかないだろうな。
- 815 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:29:27 ]
- >>812
ありがとうございます 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」みたいな文字化けしたような感じで 書き込まれるのかと思ってたけど違うのね こんな文字化けしたようなdatファイルとかってどうやって作ってるの?
- 816 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:36:58 ]
- 文字以外を書き込めばなりやすいな
- 817 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:44:10 ]
- >>815
書きたい内容をそのまま書けばいい。 static const unsigned char data[] = { 0xBF, 0x83, 0xC3, 0x32, 0x3A, 0xCE, 0x53, 0x53, 0xB6, 0xA2, 0x38, 0x8A, 0x49, 0x4D, 0xC0, 0xD7, 0x92, 0x6A, 0xD5, 0xD1, 0xA9, 0x74, 0x6E, 0x8C, 0x7B}; // 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」 FILE* fp = fopen("test.dat", "wb"); fwrite(data, 1, sizeof(data), fp); fclose(fp);
- 818 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:47:54 ]
- そのデータだと
FILE* fp = fopen("test.dat", "w"); fwrite(data, 1, sizeof(data), fp); fclose(fp); でも同じ物が書き込まれるがね。 バイナリモードとテキストモードの違いは メモリ上で 0x0D('\n') となるバイトを ファイル上でその環境の改行コードに変換するか否かしかない。
- 819 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 08:05:56 ]
- >>817-818
ありがとう。でも全然分からない おれにはまだ早かったみたいです とりあえずテキストとバイナリモードの違いは\nとかが違うだけで文字は変わら ないんですね 勉強してきます
- 820 名前:デフォルトの名無しさん [2008/02/03(日) 09:13:33 ]
- >>811
なければ自分で作ればいいじゃん。 俺は処理系非依存のプロパティ変数クラスを作った。
- 821 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:00:39 ]
- >>819
結果はメモ帳で見るよりバイナリエディタで見た方が分かりやすいかと思う。 何かバイナリモードとテキストモードでもの凄く違うと考えてるみたいだが、 動作的には大した違いはない。 普通は fprintf はテキストモードで、fwrite はバイナリモードで使うが、 別にそう使わないといけないという決まりはないんで、 バイナリモードとテキストモードで同じ物を書き込んで それぞれどうなるか実験してみればいい。
- 822 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:25:33 ]
- >>820
プロパティリストではなくて、delphiのプロパティ宣言みたいなものが作れるの?
- 823 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:01:34 ]
- >>820
初期化が必要なのは面倒臭い。
- 824 名前:デフォルトの名無しさん [2008/02/03(日) 12:57:16 ]
- 複数のソースで使うヘッダファイルの変数や関数が、
多重に宣言されないように、externの宣言がありますが、 ヘッダファイルに↓みたいな多重インクルードガードをつけたときも、 externは必要なのでしょうか? #ifndef AAA_H #define AAA_H //ヘッダの内容 #endif
- 825 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:01:13 ]
- extern はリンク時の多重宣言を回避するための物。
インクルードガードはコンパイル時の多重宣言を回避するための物。 全く別の物。
- 826 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:26:37 ]
- >>824
必要。
- 827 名前:824 mailto:sage [2008/02/03(日) 13:32:45 ]
- >>825
>>826 ありがとうございます。 今は、複数ソースで共有する変数/関数にはextern、 全ヘッダにとりあえずインクルードガードをつけてます。 違いがよくわからず、不安なんですが、 こんなんでいいのでしょうか? ちなみに、関数の方はexternをつけなくても動きました。
- 828 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:42:54 ]
- 関数はデフォルトでextern
- 829 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:45:22 ]
- コンパイルとリンクの違いを調べるといいよ
- 830 名前:デフォルトの名無しさん [2008/02/03(日) 13:51:38 ]
- c++で、int [] hoge(適当な引数)
みたいに、配列を返す関数って定義できますか? 上記はできなかったので、結局int []を持つstructを定義して、それを返すように したのですが、、
- 831 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:54:14 ]
- 普通は効率を考えて配列を渡してそこに書き込むようにする。
- 832 名前:824 mailto:sage [2008/02/03(日) 13:54:51 ]
- >>828
そうなのですか。一つ大きな疑問が解決しました。 ありがとうございます。 >>829 勉強してみます。
- 833 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:58:36 ]
- >>827
関数でも、関数定義を複数書けばエラーになるよ。 エラーにならないのは関数定義は1つしか書いてなくて、 他は関数プロトタイプしか書いてないから。
- 834 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:30:12 ]
- >>825
うそん。 >extern はリンク時の多重宣言を回避するための物。 多重宣言どうこうっていうか、外部結合を明示するだけの物じゃないのか? そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ? 突っ込み入らないってことは俺が誤解してるんだろうか。
- 835 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:37:54 ]
- >>834
>そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ? そのとおりだよ。 extern指定子の無い宣言は仮の宣言。 コンパイル単位に定義が見つかったら、仮の宣言は冗長な定義として 無視される。そうでなければ0で初期化される単一の定義になる。 と思ってる。
- 836 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:38:09 ]
- C は仮定義があるから初期化しなけりゃ
複数の記憶クラス指定子のない変数宣言があっても大丈夫。 C++ は仮定義が廃止されたので 複数の記憶クラス指定子のない変数宣言があるとエラー。
- 837 名前:デフォルトの名無しさん [2008/02/03(日) 14:40:39 ]
- gcc用で配布されているコードを,
VisualStudio2005でコンパイルしたところ, エラー 1 error C2143: 構文エラー : '{' が ':' の前にありません。 c:\program files\microsoft visual studio 8\vc\include\cmath 18 エラー 2 error C2059: 構文エラー : ':' c:\program files\microsoft visual studio 8\vc\include\cmath 18 といった無数のエラーが出ました. ちなみにcmathはインクルードしておらず, #include<stdio.h> #include<stdlib.h> #include<math.h> #include<complex> だけです. どなたかアドバイス頂けませんでしょうか?
- 838 名前:デフォルトの名無しさん [2008/02/03(日) 14:45:22 ]
- >>831
ありがとうございます。 参照渡しとかですね。 すいません、あと1つ質問させてください。 stringを継承して、[]をつかって[-1]と[サイズ+1]の要素にアクセスに行ったときだけ 動作の異なるクラスを定義できますか?自分でやろうとしたのですが、コンストラクタ は継承されないから自分で定義しなおさないとダメなのですよね。そうすると、コンストラクタ を書くのが結構大変なような気がしたので。
- 839 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:49:14 ]
- >>838
コンストラクタだけじゃなくて演算子だって定義する必要があるんだぜ。 戻り値の型が変わるから。 at 関数を使うと範囲チェックして out_of_range 例外投げるから それ使えばいいんじゃね?
- 840 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:51:57 ]
- a.exe から LoadLibrary で b.dll を呼び出すんだけど、
b.dll から右側では .NET を使いたい。 a.exe → b.dll このような場合、b.dllをC++/CLIで作成することになるのかしらん?
- 841 名前:デフォルトの名無しさん [2008/02/03(日) 14:54:13 ]
- >>839
なるほど、それでやってみます。 サンクス!
- 842 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:58:05 ]
- >>838
stringは仮想デストラクタを定義していないから public継承するのはどうかと思うけど、コンストラクタ の呼び出しに関しては、stringのコンストラクタ を派生クラスのコンストラクタ初期設定リストで 指定すればいいだけじゃないの。
- 843 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:58:47 ]
- >>840
a.exeからC++/CLIでどぞ
- 844 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:01:44 ]
- >>840
C#でもVB.NETでもお好きにどうぞ
- 845 名前:840 mailto:sage [2008/02/03(日) 15:16:22 ]
- >>843
a.exeは他所で作ったものだから、漏れはいじれないんだ。 >>844 LoadLibraryでもマネージDLLを呼び出すことができるってこと?
- 846 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:31:59 ]
- >>808>>809>>812
返答ありがとうございます 色々とやり様があるみたいですが、c++的にはやはり生の配列を返すよりコンテナを返したほうがよいのでしょうか? そうするとやはりlistを引数に取る関数に参照渡しが無難なのかなぁ・・・?
- 847 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:33:16 ]
- class Hoge1
{ void hatena(void) { Hoge2 ht; ht.nazo(*this); } }; class Hoge2 { void nazo(const Hoge2 &rho){} }; みたいなのがあって ht.nazo(*this);のところでエラーになります。 どうす
- 848 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:36:10 ]
- >>847
nazo(const Hoge1・・・にす
- 849 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:37:13 ]
- &rho
- 850 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:37:17 ]
- >void nazo(const Hoge2 &rho){}
nazoは引数にHoge2を取るようだが thisポインタってhoge1のアドレスを示してるんじゃないの?
- 851 名前:837 mailto:sage [2008/02/03(日) 15:38:34 ]
- >>837
の質問はVC++スレに書き直しました. マルチポストすいませんでした.
- 852 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:41:31 ]
- Hoge &rho
- 853 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:41:53 ]
- 化けるのね。
- 854 名前:デフォルトの名無しさん [2008/02/03(日) 15:42:31 ]
- hoge piyo fuga
- 855 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:45:11 ]
- &
- 856 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:46:57 ]
- &a
- 857 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:51:34 ]
- &rh
- 858 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:53:17 ]
- &abcd
- 859 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:55:04 ]
- &rho
- 860 名前:デフォルトの名無しさん [2008/02/03(日) 18:14:16 ]
- なぜか、参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます。
#include <stdio.h> int main(void) { int i, j, ln; printf("何段ですか:"); scanf("%d", &ln); for (i=1; i<=ln; i++); { for (j=1; j<=i; j++) putchar('*'); putchar('\n'); } return (0); } ちなみにOSはVistaです。どこか違っていたら教えてください。
- 861 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:19:32 ]
- for (i=1; i<=ln; i++);
これ。 「;」という何の処理もしない文をforでループさせることになってる。
- 862 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:21:39 ]
- >>860
正解が何か知らんからわからんが 改行の位置がおかしいんじゃないか?
- 863 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:23:03 ]
- >>861
スマソ そうだね 改行は問題ないわ
- 864 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:23:08 ]
- test
- 865 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:25:57 ]
- >>860
>参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます このスレを見ている人はその参考書のことなんてしらない。 どのような結果を求めているのかを提示しないと、どこが違っているのか答えられないよ。 明らかにおかしいコードだから答えは>>861の通りだろうけど、もうちょっと質問の仕方を考えたほうがいいよ。
- 866 名前:デフォルトの名無しさん [2008/02/03(日) 18:26:15 ]
- >>861
サンクス 無事実行できました。
- 867 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:26:28 ]
- 861に書かれていることと
その下の行の { が足りないことで たまたま{ }の対応がうまくいってコンパイルは通ってるんだな。 なので2ヶ所修正
- 868 名前:デフォルトの名無しさん [2008/02/03(日) 18:26:51 ]
- C言語でのアルゴリズムの質問をさせて下さい。
現在以下のようなプログラムを作ろうと思っています。 0〜65535までの数字をIDとしてユーザに割当てる。 ユーザが割当てられたIDを使わなくなったときはそのIDを返却し、 返却されたIDは回収されて他のユーザに割当てられる。 最も簡単なやり方は、user_id[65536]などの大きな配列を作って、 使用状況を配列の中身の0か1で判断する、といったものかと思います。 しかしこのやり方よりもっと効率的なものはないでしょうか? このような大きな配列を作るのは実装としてまずいのかな…と感じています。 初心者で申し訳ありませんがアドバイスよろしくお願いします。
- 869 名前:867 mailto:sage [2008/02/03(日) 18:27:59 ]
- あ、違った。
ごめん
- 870 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:29:28 ]
- とはいえ入門書で{}略すのはイクナイと思う。
- 871 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:29:56 ]
- >>868
64Kなら、オンメモリで処理してもいいんじゃね? ビットで処理したら、8Kで収まる。
- 872 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:31:50 ]
- >>868
更に上限を増やさなければならない可能性があるなら、 別のやり方を考えたほうがいいと思うけど、 それぐらいなら問題ないと思うね。
- 873 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:32:16 ]
- >>870
ぜんぜんOK
- 874 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:36:59 ]
- >>868
その、配列やり方でいいと思うよ。 ランダムに返却され再利用されるならそれしかない。>>871のようにビットマップで配列は小さくできる。 連続の範囲でとりますとか特徴があれば、それを使って効率的に管理することもできる。
- 875 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:37:36 ]
- ある静的メンバ変数を含むクラスをテンプレート化しました。
この場合、静的メンバ変数は、テンプレート引数ごとに別々の実体が 作られるということで、このことは確認できました。 で、質問なのですが、この静的メンバ変数の初期化は、 いつ行われるのでしょうか? テンプレート化してない場合は、mainが始まる前ということで、 これは手元の本にも載っているのですが、 テンプレート化した場合、実際にどんなテンプレート引数で クラスが作られるかわからない段階で初期化ってできるのか、と 思ったものですから。 実際、mainの最初で、静的メンバ変数の値を見てみてみても、 なぜかちゃんと初期化した値が入っているように動きます。 なぜなのでしょうか。
- 876 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:41:47 ]
- コンパイル終わったときにはわかってるから。
- 877 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:43:13 ]
- テンプレートはビルド時に、
初期化コードも含めてすべて実体化されるだろ。
- 878 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:44:51 ]
- >>876
>>877 むむむ、そういうことですかーーー。 考えが至りませんでした。 ありがとうございました。
- 879 名前:868 [2008/02/03(日) 18:56:06 ]
- >> 871,872,874
アドバイスありがとうございます。 特に問題がないようですので、このやり方で続行します!
- 880 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:14:04 ]
- C++だとbitsetでやるのが楽なんだろうけどな
- 881 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:20:13 ]
- それだとフリー探索がO(N)になるから、vector<unsigned short>(65536)という
手もよくあるパターンではある。
- 882 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:23:17 ]
- set<>は使えんの?
- 883 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:24:46 ]
- >>881
なんでunsigned shortなの?
- 884 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:32:59 ]
- intよりは節約できるし、IDは0〜65535なんだろ?
- 885 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:37:16 ]
- サンプルコード見ながら勉強してるのですが
this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide; #pragma endregion private: の、->、::、#、:、の意味がよくわかりません 調べたいのですが、記号はGoogleで検索できないので、この記号の名称を教えてください
- 886 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:42:26 ]
- サンプルコードを見る域に達してないな
- 887 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:45:39 ]
- だから質問しているんです
- 888 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:45:51 ]
- それどころか勉強すら始まってないな
- 889 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:46:37 ]
- なんか本買えよ。
というか、そんな変態言語じゃなくて、普通のC++から勉強しろ
- 890 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:50:40 ]
- >>887
無料で見れる情報、無料で協力してくれる人だけをあてにして勉強する気? 独学で身につけるだけの基礎的な力をもっているならまだしも、 まったく何も持っていないなら勉強するための最低限の準備くらいはしたら?
- 891 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:52:27 ]
- >>885
何でも良いからCの入門書を読んでからにしようぜ
- 892 名前:デフォルトの名無しさん [2008/02/03(日) 20:00:57 ]
- 質問ていうか相談なんだけど
TXTファイルの文字列置換ツール作たいんだけどさ 置換箇所だけ更新かけたいんだよ でもさ、fopenでファイル開くと一箇所変えると全部上書きしないといけないじゃん 置換箇所だけ更新かける方法ない?
- 893 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:07:34 ]
- C++/CLIの文法はアレだからなー。
- 894 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:07:49 ]
- 一旦、別のファイルに書き出す。
その後、元ファイルを削除し、 さっき書き出したファイルの名前を元の名前に変える。
- 895 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:08:21 ]
- 文字数変わらないなら、fseekとかfwriteあたりを駆使して
上書きすりゃいいじゃん。 ずれるのならご愁傷様。
- 896 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:29:30 ]
- >>892
ファイルの途中でサイズが増減しても、局所的な更新だけですむような ファイルシステムを実装する。
- 897 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:08:44 ]
- >>874
> ランダムに返却され再利用されるならそれしかない。 そんなことはないだろ。 組み込み用途だと、8KB なんて言うテーブルなんてとんでもないと言う こともあるだろうし、PC でも ID を 32bit にしたいとか言われたら、 どうするんだよ。(w >>868 ID の範囲に比べて、同時使用ユーザ数が極端に少ないなら普通にリニア サーチして管理することもできるし、同時使用ユーザ数がそれなりで ID の割り当て・回収の処理コストが問題になるならハッシュとかBツリー を使うこともできる。
- 898 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:09:38 ]
- stl::map<stl::string, Animal> animals;
Animal &a = animals["cat"]; この時点で、aに入る物は出来ていますか?
- 899 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:13:50 ]
- stlの定義による。
stlがstdの間違いなら、aは正しく要素を指している。
- 900 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:27 ]
- >897
「何」を、リニアサーチするんだ?
- 901 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:42 ]
- >>897
また組み込み厨がでたよ。 特殊な環境を持ち出して、いちいち反論するヤツ。
- 902 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:25:25 ]
- >>897
ランダムに返却されれば、2^65536の組み合わせが発生する。それを記録処理するには65536bit必要になる。すなわち8Kバイトだ。 それ以下にするには、IDの消費が均一ではなく偏らせる必要がある。 たとえば、連続してIDを取得する。そういう特徴があれば、それに応じた処理にして節約すればいい。しかし、それはランダムとは言えない。
- 903 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:29:51 ]
- >>897
どこに極端に少ないと書いてある?
- 904 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:31:54 ]
- その次に「なら」ってかいてあるがな
- 905 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:33:18 ]
- >>884
いまさらだけど、配列の中身は0か1って書いてあるんだからshortは必要ないだろ
- 906 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:34:05 ]
- そこかしこのレスから揚げ足を取りたがってるオーラを感じるのは俺だけでいい
- 907 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:34:51 ]
- 文章構成がアレだね。
前半は、「パターンがランダムでも、メモリ8KBも取る必要はない」って言ってて、 後半は、「パターンがランダムでなければ、節約する方法がある」みたいな。
- 908 名前:881=884 mailto:sage [2008/02/03(日) 21:37:43 ]
- えと、つまり、vectorのvがあるとして、
初期値として、(65535〜0)を入れとくわけね で、こうするとO(N)で触れる、ってだけの話。 要求(){ return v.pop_back() } 解放(id){ v.push_back( id ); }
- 909 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:41:34 ]
- それ O(N) じゃなくて O(1) だろ。
解放でデタラメな id 食わされたら死ぬとか言う問題もあるかもね。
|

|