- 1 名前:デフォルトの名無しさん [2008/02/27(水) 02:03:30 ]
- C++標準ライブラリの一つ、STLについて。
前スレ 【C++】STL(Standard Template Library)相談室 8 pc11.2ch.net/test/read.cgi/tech/1198435319/ 過去ログ・リンク・書籍紹介は >>2 以降
- 620 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:07:29 ]
- お尋ねします。
vector<vector<bool>> TempA; vector<vector<bool>>::iterator itr1; vector<vector<bool>>::iterator itr2; と宣言したとします。 itr1 = TempA.begin(); itr2 = TempA.begin(); としたのち、 TempAのたとえば2行目と3行目の中身すべてを比較したいとき、 itr1++;itr2 += 2;としてiteratorを進めて、 *itr1 == *itr2の比較を一度行えばいいのでしょうか? それとも、各行でiteratorを作成して、 各行ベクトルの列座標に対応したiteratorを回す必要がありますか? p.s.この動作のあと、一致している行を、 itr2=Temp.erase(itr2); みたいに削除したいのです。
- 621 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:34:38 ]
- >>620
要するに二つのvectorを==で比較できるかってことだよな できるよ
- 622 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 16:46:22 ]
- >>621
ありがとうございます。 行に対応するvectorの各要素の比較という認識で大丈夫でしょうか。
- 623 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:17:13 ]
- そう。要素ごとに==で比較してる
- 624 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 18:19:40 ]
- >>622
23.1 Container requirements に a == b は a.size() == b.size() && equal(a.begin(), a.end(), b.begin()) と等価と書いてある。
- 625 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 22:12:31 ]
- >613
map使わずにソート済vector使えばいいんじゃね?
- 626 名前:620 mailto:sage [2008/06/05(木) 10:43:24 ]
- >>623
亀レス申し訳ない。 ありがとうございました。 そういう情報ってどのヘッダーを見ればいいんでしょうか? vector.hを眺めていてもさっぱりです…。
- 627 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:34:56 ]
- >>626
ヘッダーには書いてないだろう・・・ お使いのコンパイラのリファレンスマニュアル等を読め VCならこのへん↓ msdn.microsoft.com/en-us/library/5asks2ba(VS.80).aspx
- 628 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:16 ]
- >>626
C++の規格書一回読んでみるのもいい。
- 629 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 20:20:37 ]
- vectorかその内部でincludeしてるファイルに書いてあるんじゃね。実装が。
- 630 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:17:16 ]
- イテレータを返すbegin, endが、どうして戻り値の型が違うだけで(iterator, const_iterator)オーバーロードされた関数を特定できるのかが分かりません。
自分で同じ様な事をしようとしてもSTLとは違いコンパイラが関数を特定できずに失敗します。
- 631 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:22:06 ]
- >>630
戻り値の型じゃなくて、引数リストの後ろの const の有無が違う。
- 632 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 10:36:05 ]
- >>631
それは実装側のbegin, endの定義ですよね? 自分で作ったものもconst_iteratorを返すものは引数リストの後にconstをつけているんですが、 これは利用する側が呼び出すときには特に関係ない様です。 まさか container_type::const_iterator it = ((container_type::const_iterator (container_type::*)()const)container.begin)(); なんてしなきゃいけないんですか?
- 633 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:24:47 ]
- iteratorからconst_iteratorへの変換はできるようになってる?
- 634 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:27:59 ]
- 変換できるようにしたら const_iterator begin() const の必要性なくならないか?
- 635 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:31:44 ]
- なんで?
constなインスタンスに対してイテレータ取得できなくなっちゃうじゃん
- 636 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:59:04 ]
- VC7
template<class _Ty,class _Alloc> class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>
- 637 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 19:44:07 ]
- >>636
補足しとくと、iteratorは基底クラスであるconst_iteratorに変換できるといいたいだけ。 constなしbegin()の戻り値はiteratorだからconst_iteratorにも変換されうる。 begin()の戻り値を渡す先がconst_iteratorかiteratorかで、 begin()の種類(後ろにconst付きか否か)が選択されているわけじゃない。
- 638 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:14:29 ]
- >>632
MyContainer c = ... MyContainer const& cc = ... MyContainer::const_iterator = c.begin(); MyContainer::const_iterator = cc.begin(); これをトレースするといいよ。
- 639 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:30:21 ]
- なるほど、constなメンバ関数はオブジェクトがconstな時に使用されるんですね。
- 640 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:26:16 ]
- constメンバ関数と非constメンバ関数が両方ともある場合はそうなる。
非constメンバ関数がない場合は非constオブジェクトからもconstメンバ関数が呼ばれる。
- 641 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:31:07 ]
- \n とか \r\n とかが入った文字列を SetDlgItemTextすると
char のときはちゃんと改行してるのに string だと改行されずに何も表示されないわけですが string って \n とかとは別に改行とかタブコードがあるんでしょうか?
- 642 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 20:40:55 ]
- 実際のコード貼ってみれ
- 643 名前:641 mailto:sage [2008/06/13(金) 21:37:36 ]
- あははははは!!!!!
エディットコントロールのマルチラインがFalseなだけだった 俺市ねw
- 644 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:13:13 ]
- 641は死んだの?
- 645 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 22:49:25 ]
- >>644
今日までの641は氏に、また一歩成長したプログラマーとして生まれ変わるのです。
- 646 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 12:34:34 ]
- >>645が良い事言った
- 647 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:25:44 ]
- フェニックスシングルトンなわけですね。
- 648 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:30:12 ]
- シングルトンを真面目に考えるとややこしい事限りないなあ。
- 649 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:31:25 ]
- 非常に優秀なデザインパターンの1つだと思うな
- 650 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:36:29 ]
- インスタンスの数が1個に限定される分、むしろ単純にならないか?
- 651 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:39:16 ]
- Modern C++ Design を読むと
シングルトンのややこしさがよく分かる。 Scala みたいに言語的にサポートしてくれればいいんだが。
- 652 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:48:11 ]
- 作るのはいいけど削除のタイミングが面倒くさいんだよね。
- 653 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:53:21 ]
- いつでもnewdelete出来るように改良した、って自慢げに変なシングルトン使いまくる奴ならいたな
- 654 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 15:58:26 ]
- deleteしたら自動的に新しいインスタンスが作られて、
newしたら自動的に今あるインスタンスが削除されるシングルトン
- 655 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:51:25 ]
- >言語的にサポート
使う人間のスキルへの依存度が高いC++に期待してはいけないものだよ。
- 656 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 16:59:25 ]
- シングルトンて心太に似てるよね
- 657 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:36:28 ]
- STLを軽く弄るためにこのスレを覗きにくるC++ビギナーはフェニックスシングルトンとModernC++Designをどうやって関連付けて考えるだろうか。
- 658 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 18:37:22 ]
- 「スレ違い」 と関連づけて考える事だろう
- 659 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:42:54 ]
- mapはどうやってfindなどで入力されたキーが木にあるキーと同じかどうかを見るんでしょうか?
比較関数ならstd::less<T>がデフォルトで入っていてこいつを使えば良いと分かるんですか、 これと同じ様に一致関数をテンプレート引数で指定できませんか?
- 660 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:45:23 ]
- 比較関数をltとすると、
!lt(x, y) && !lt(y, x) で一致判定してる
- 661 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 19:46:43 ]
- マップのキーは、その比較関数を使って一致を判断する
!(a < b) && !(b < a) なら a と b は一致していることになる
- 662 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 20:12:24 ]
- そして等価と等値の話が始まる。
- 663 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 22:07:44 ]
- 重要な概念だしな
- 664 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 09:53:59 ]
- そしてEffective STL が売れる
- 665 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 10:08:08 ]
- そして日本語版Modern C++ Designが叩かれる。
- 666 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:05:30 ]
- ListとかVectorってスレッドセーフですか?
複数のスレッドからイテレータ取得してアクセスしたりするなら シグナルやミューテクスでロックしてからアクセスするべきですか?
- 667 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:10:46 ]
- そうですね。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:16:56 ]
- >>666
実装次第。 各処理系のマニュアルを読むよう。
- 669 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 15:29:14 ]
- STLportでぐぐらない方が良い。
- 670 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:02:10 ]
- スレッドセーフなのか?という問いに答える者はいなかったといふ
- 671 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:04:49 ]
- 実装次第だし。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 20:09:48 ]
- スレッドセーフではない と一律で答えておいたほうが面倒がない
- 673 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:24:55 ]
- Camelなリストやベクタはスレチ。
- 674 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:43:27 ]
- というか、「スレッド」の概念が標準C++にあるんだっけ?
- 675 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:54:49 ]
- ございません
- 676 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:07:35 ]
- スレッドの概念が無いから「スレッドセーフでない」という概念も無い。
- 677 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:15:17 ]
- C++0xにご期待下さい
- 678 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 02:26:33 ]
- >>670 >>531-540
- 679 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:08:47 ]
- コンテナの範囲外にイテレータがインクメントされてしまってもコンテナを自動で拡張し、
あたかも未だに範囲内を指している様に振舞うイテレータってのがあると思うんですけど 実際はなくてただの思い過ごしだったりしますか?しなかった場合はそれが何なのか教えてください。
- 680 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:22:49 ]
- insert_iteratorのことを言ってるのかな。
- 681 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 22:35:13 ]
- 自己解決もしたし意味不明な書き込みなんてみんな無視してくれるだろうと思っていたら教えてくれている人が居た。
ありがとう。
- 682 名前:デフォルトの名無しさん [2008/06/20(金) 15:05:13 ]
- std::vector<std::string> v1;
みたいなインスタンスをシリアライズ化したいんですけど、単純に FILE *fp = fopen("vec.bin", "wb"); fwrite(&v1, sizeof(v1), 1, fp); fclose(fp); みたいに書き込めば良いんですかね? そして戻すときは、逆に std::vector<std::string> v1; char* buf = (char*)&v1; FILE *fp = fopen("vec.bin", "rb"); while(fread(buf++, 1, 1, fp) > 0); fclose(fp); みたいな感じでいいんですかね? STLのインスタンスのシリアライズ化で、もっと適切な方法があったら教えてください。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:33:55 ]
- vectorの内部にはポインタも含まれるから
オブジェクトの性質を考えてPOD型のデータまで落としこまないとダメだろう
- 684 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:38:38 ]
- vectorの扱う型ががフリーストアを使ってないという保証があればあるいは
- 685 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 15:46:36 ]
- boost::serialization使うって手も <あまり使いやすくは無い
- 686 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:45:27 ]
- VS2005では一応下のコードは正常に動きました。
とりあえずこれが動けば十分です。 std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); fwrite(&v1, sizeof(v1), 1, fp); fclose(fp); std::vector<std::string> v2; char* buf = (char*)&v2; fopen_s(&fp, "vec.bin", "rb"); while(fread(buf++, 1, 1, fp) > 0); fclose(fp);
- 687 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:53:25 ]
- >>686
まてまて、それv1の確保したメモリアドレスをv2が指しているだけだろ。 終了時に2重解放でエラーになってないか?
- 688 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:54:48 ]
- と思ったら、デストラクタで怒られました。
何がいけないんだろう・・・
- 689 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 16:58:00 ]
- 上の人も書いてるけどvectorは内部にポインタを持ってるんだってば。
(ついでにstringもな) fwriteでv1を直書きすると、ポインタのアドレスが保存されるだけで、 ポイント先は保存されないんだよ。
- 690 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:00:54 ]
- >>687,689
どうすればいいでしょうか。 やりたいことは、カンマ区切りで並んでいる大量の文字列データがあって、 それをカンマの区切りを探しつつ読み込むと非常に時間がかかるので、 初回だけカンマ区切りを解釈したら、その後はインスタンスをバイナリで一気に保存、一気に復元したいのです。
- 691 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:04:45 ]
- vector使わずに配列を使えばいいんでしょうが、vectorのデータをシリアライズ化するということは
ニーズとしてあるはずなので、そういう手法があれば教えていただきたいのです。 ただシリアライズのためにboostという別ライブラリを使用するのは、ちょっと大げさすぎかなと。。 そこまでするなら配列でやります。
- 692 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:10:08 ]
- 自分の力量・理解度に応じた実装をするべし
- 693 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:11:11 ]
- 最低限のデータを保存したい場合はこうじゃない?
std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); const char *pstr; fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存 for(size_t c=0, e=v1.size(); c < e; c++) { pstr = v1[c].c_str(); fwrite(pstr, strlen(pstr), 1, fp); } fclose(fp);
- 694 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:21:42 ]
- stringのサイズ保存してなかったので訂正
書き込み std::vector<std::string> v1; v1.clear(); v1.push_back("要素1"); v1.push_back("要素2"); v1.push_back("要素3"); FILE *fp; fopen_s(&fp, "vec.bin", "wb"); fwrite(&v1.size(), sizeof(size_t), 1, fp); //読み込むときの利便を考えて要素数を保存 size_t size; for(size_t c=0, e=v1.size(); c < e; c++) { size = v1[c].size(); fwite(&size, sizeof(size), 1, fp); fwrite(v1[c].c_str(), size, 1, fp); } fclose(fp);
- 695 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:28:10 ]
- 読み込み
std::vector<std::string> v2; FILE *fp; fopen_s(&fp, "vec.bin", "rb"); size_t size; fread(&size, sizeof(size), 1, fp); v2.resize(size); for(size_t c=0, e=size; c < e; c++) { fread(&size, sizeof(size), 1, fp); v2[c].resize(size); fread(&v2[c][0], size, 1, fp); //stringの確保するメモリが連続してない環境なら、一度vectorなりに読み込む必要が //あるが、vcなら問題ないので省略 } fclose(fp);
- 696 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:33:26 ]
- 最初にもちらっと書いたが、serialization使うとこれですむ
//保存 { vector<string> data; data.push_back("Hello"); data.push_back("World"); ofstream file("save.dat"); boost::archive::text_oarchive oa(file); oa << (const vector<string>&) data; } // 復元 { vector<string> data; ifstream file("save.dat"); boost::archive::text_iarchive ia(file); ia >> data; } 下準備がちょっと面倒だけどな。 興味あったら下記を参照してください。 ttp://www.kmonos.net/alang/boost/classes/serialization.html
- 697 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:48:04 ]
- >>694,695
やっぱり要素ごとにサイズと一緒に保存という形しかないんでしょうか。 私のイメージではシリアライズというと、メモリ上にあるオブジェクトの塊を そのままバイナリで一気に書き込むという感じで、だからこそ高速化に役立つと思うのです。 要素ごとに書き込んでいると、カンマ区切りのケースとそれほど時間の差が出ないような・・・ MFCのCObjectを継承したクラスはシリアライズができますが、それはおそらく、 オブジェクトのデータやステートをメモリ空間上で一塊になるようにしている配置しているからこそ できるんじゃないかと思います。 STLではどうもそういう仕組みはないようなので、保存や復元に時間がかかるのは無理ないんでしょうかね。。。 >>696 boostの場合はどうなんでしょうか。 保存と復元を高速化できるかどうかがキモなんです。
- 698 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 17:55:59 ]
- >>690
カンマ区切りの文字列の読み込みに、そんなに時間がかかるとは思えんが。 時間がかかっているのはパースよりもvectorの伸張だろう。 先にカンマの数をカウントしてvector.reserve()するとか、vectorではなくて dequeにするとかの方が速くなるかと。
- 699 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:06:48 ]
- >>697
MFCのシリアライズは、各メンバをひとつずつCArchiveに書き込んでたと思うよ CObjectを継承すれば自動的にサポートされるものでもなく、メンバをひとつずつ書き込むコードを各クラスに個別に実装する必要があった シリアライズに対するそのイメージは誤りかと
- 700 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:31:32 ]
- データ個数にもよるが保存と読み込み時間を短縮したいなら
まずデータ構造自体から見直すべきだろ。 というか、そこがネックになってる時点で何かが間違ってる。
- 701 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:44:43 ]
- >>699,700
そうなんですか。 可変長データ配列のオブジェクトの保存と復元を高速化するためには、 各自が工夫して実装するしかないんですかね。 なんか車輪の再発明のような気が・・・ 配列要素の変更・追加・削除は頻繁にはやらないので、そちらの時間コストは多少増えてもいいんです。 とにかくソフトの起動をコンマ1秒でも速くするために、ドカンと一気に読み込めるようにしたいんですよね。 BYTE型配列1本と、ポインタ・サイズを格納した配列の計2本で、 そういったことをやれそうなイメージはあります。
- 702 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 18:45:42 ]
- vector<string>が固定長なデータじゃないので、要素ごとにアクセス
しなければならないのは仕方が無い。 また、上の例でも1文字ずつカンマをチェックしながらアクセスするよりは、 単純に数倍は速いよ。 ディスクアクセスが気になってるのなら、あらかじめメモリ上に 直列化して、総サイズも一緒に書き込むとか工夫しなさい。 (もともとfread、writeがバッファリングしてるので、あまり効果は無いだろうけど) あとboostのも1要素ごとの読み書きです。 入れ子になってるコンテナの巡回探査がデフォで出来るってだけ。
- 703 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:42:53 ]
- ほんとに直列の読み書きがしたければAPI叩くしかないんじゃないかなあ
- 704 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 20:59:26 ]
- >>701
まぁ今回の件に限らず、「コンマ1秒でも速くする」というような目標を持っている場合、 車輪の再発明は避けられないことが多いよね(そうでない場合も勿論あるけど)。
- 705 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:01:24 ]
- 本当に速くしたいなら MMX とか SIMD とか使うと
- 706 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 21:54:44 ]
- DANGOさんの出番だな
- 707 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 22:09:39 ]
- : premature optimization is
(省略されました。続きを読むにはワッフルワッフルと書き込んでください)
- 708 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 01:24:43 ]
- ポインタのない言語なら>>686みたいなことは当たり前にできるんだけどな。
ポインタのある言語では、一気に話が複雑になるな。
- 709 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 06:23:29 ]
- データの入出力なんて元々複雑で時間の掛かる処理なんだから
横着するつもりなら効率の劣化には目を瞑るべき。 大体そんな困るほど遅くなることなんぞ滅多に無いし。
- 710 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:47:42 ]
- だいたい直列化してないデータを直列させるからシリアライズと
いうのに、最初からメモリ上に直列に並んでると考えるのはどうなのよw
- 711 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 12:51:19 ]
- >>708
ポインタの無いJAVAみたいな言語だって、>686みたいな記述はできても、 要素の実際の読み書きは1つずつだろ?
- 712 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:46:07 ]
- >>686
これは素晴らしい!!! すこぶる高速ですね
- 713 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 14:49:44 ]
- >>686
これstringの実装によってはやばくないのかな
- 714 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:00:33 ]
- >>686
こんな気持ち悪いコード見たことない
- 715 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:03 ]
- >>713
そのコードがダメなのははっきりしてるから。 続きも読め
- 716 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:01:06 ]
- それ以前の問題。
- 717 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 15:42:55 ]
- ポインタ保存してポインタ復帰してるだけだからな。
- 718 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 16:59:18 ]
- >>709
いや、プログラムの起動を可能な限り速くしたいというニーズはどこにでもある。 3秒で起動するブラウザと1秒で起動するブラウザ、どっちを使いたいかといえば速い方がいいに決まってる。 そういう場合のクラスデータのシリアライズは、1分かかるのを30秒にしたいとかいうオーダーの話ではなくて、 0.3秒かかるのを0.05秒に縮めたいとかいうオーダーなんだよ。 起動時にデシリアライズするオブジェクトの数は1つじゃないしな。 トータルで1秒以内で起動させたいとか、そういうレベルのことをやりたいとなると、 バイト配列の中に直列化したデータ(多少隙間があってもいい)をあらかじめ揃えておいて 一気にシリアライズするという考えも、アリだと思う。
- 719 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:02:02 ]
- ファイル読み書きのオーバーヘッドなんてI/O待ちが大半なんだから、
よっぽどアホな処理でもしてない限り大差ないだろ
- 720 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 17:09:11 ]
- >>718
さっきドラゴンボール全巻買ってきた までは読んだ :そこ、高速化したいなら横着せず書かないといけないって書いてんじゃん
|

|