1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
730 名前:デフォルトの名無しさん [2007/08/02(木) 22:50:24 ] >>727 726でCといったのはC++を含むわけだが・・・ 単純に言って、一行読み込んで《・・》を書き換えるだけでしょ? なぜ何工程も必要なんだよ???
731 名前:710 mailto:sage [2007/08/02(木) 22:52:11 ] >>730 日本語を含む正規表現での置換処理ですので、wchar_tに変換しています。 置換を3段階行っているのは、もっと効率化できるかもしれませんが、 どの言語でもやっていることは同じです。 C++だけ特に遅くなるような書き方をしているつもりはありません。
732 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:52:15 ] C++のlocale周りを理解している人間なんて本当に少ない。おれもよくわかんないし。 それはぐぐっても日本語英語問わず資料が少ないことからも想像が付く。 そして処理系の実装はバグ持ちで遅く、ますます誰も使わず、負の悪循環。 >>730 その処理を全部省いたとしても、ワイド文字ストリームという砦が待ち構えている。
733 名前:デフォルトの名無しさん [2007/08/02(木) 22:53:54 ] >>731 正規表現使わずに、例えばchar c[1000]; に読み込んで if ( c[i]=='<' && c[i+1]=='<' ) とやった方が速いだろ
734 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:56:18 ] >>733 他言語との比較でそんな抜け道はだめだろ。
735 名前:デフォルトの名無しさん [2007/08/02(木) 22:59:27 ] 速く変換したいという目的なんでしょ?そのためにどれが速いか検討していると 普通に考えると正規表現使わず<<だけ見つけた方が速いだろって事だ
736 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:00:29 ] wchar_t なんかに変換する必要ないじゃん。 その文字コードに合わせて処理すればいいだけ。
737 名前:710 mailto:sage [2007/08/02(木) 23:02:44 ] >>735 いいえ。違います。 速くしたいのならmmap()でも使いますが、Perlで以下の3行で済む下らない 仕事に一体何行費やすつもりですか。 試しにCのコードを書いてみてください。可変長の文字列を使う時点で既に Cでは面倒くさいです。 $s =~ s{(.+)[#「\1」に傍点]}{ sprintf('<ruby>%s<rt>%s</ruby>', $1, 'ヽ' x length($1))}ego; $s =~ s/|?([々\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}]+)《(.+?)》/<ruby>$1<rt>$2<\/ruby>/go; $s =~ s{([||〔\s])([^|〔《》\s]+)《(.+?)》}{sprintf( '%s<ruby>%s<rt>%s</ruby>', ($1 eq '|') ? "" : $1, $2, $3)}ego;
738 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:03:43 ] C++ならなんでも速いというのは幻想。 速くなるようにチューニングする余地が用意されているというだけで、 素のままで速いとは限らない。正に今回はその好例。
739 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:04:18 ] 文字コードが何かもわからないのに>>733 はないだろ UCS-2だったらどうする
740 名前:デフォルトの名無しさん [2007/08/02(木) 23:04:37 ] どのコードでも、《》の配置は換わらないのでは???
741 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:06:57 ] >>735 普通の考えなんか価値なす。 大事なのは現実の速度。
742 名前:710 mailto:sage [2007/08/02(木) 23:07:40 ] >>740 漢字《ふりがな》 といったパターンを捕まえて、変換しなければなりませんので、 文字クラスにUnicodeが使えると便利なのです。 それに、「全ての言語で」Unicodeの正規表現を使っています。 C++だけわざわざそうしているわけではありません。
743 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:09:53 ] >>735 他の言語でも同じことやったら、またC++より速くなったりしてw
744 名前:735 [2007/08/02(木) 23:09:59 ] >>710 、ちょっとまってて いま書くから もとのファイル354Kしかないから100倍 (35M) に増やして比較しようぜ! そしたら速度差は歴然になるからさ
745 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:11:22 ] 思わずどっちの方向に歴然とした差が生まれるのかwって言いたくなる。
746 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:45 ] ソース見てなかった 》携帯からのtypoかと思ってた
747 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:52 ] じゃあ俺はHSPで書く!!
748 名前:735 [2007/08/02(木) 23:16:30 ] ちなみに漢字コードは元々のシフトJISに限定するけどいい??
749 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:18:52 ] ついでだからwchar_tに変換するものも書いてよ。 変換方法は何でもいいからさ。
750 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:20:50 ] >>731 まず入力にはboost::spirit::file_iteratorを使う デコード用のiteratorは自分で書くかboostの中から探す つぎにxpressiveのregex_token_iteratorでトークンに分ける(cvsのでないと遅くなるので注意) そのトークンに付け加えつつストリームに出力する こうしてstd::stringどころかヒープさえほとんど使わないで出力する これで世界最速のプログラムの完成である (完)
751 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:23:05 ] そもそも、Perl だろうが何だろうが、 ターゲットの文字コードは分かんないとあかんだろ?
752 名前:デフォルトの名無しさん [2007/08/02(木) 23:25:29 ] 文字コードを統一する部分を持っていればよい
753 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:32:51 ] 標準ではないけど、mbs系の関数使えば?
754 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:30 ] やっぱ面倒になった 方針だけ書いておく e[2]="《"; f[2]="》"; strに一行読み込み str[n] str[n+1]がeと一致するものを探して k=n-2、n-4・・・を調べて (c[k]>134 && c[k]<160) || (c[k]>223 && c[k]<254)でないもの(漢字でない)を見つける そのあとに<ruby>を挿入して、漢字もつなげる 以下同様にやる
755 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:35 ] とりあえず、boostをベースに、iostreamをstdioにしてみた。 コンパイラはVC2005。対象は、SANSHIRO.txtを20回繰り返した7MBのテキスト 測定は面倒だったから、cygwinのbashのtimeで。 boost$ time ./boost ../input/20.txt real 0m9.324s user 0m0.031s sys 0m0.015s stdio$ time ./boost ../input/20.txt real 0m7.356s user 0m0.031s sys 0m0.015s
756 名前:710 mailto:sage [2007/08/03(金) 00:24:26 ] >>755 stdio版も意外に遅いですね。 time cygstart aozora.js ../input/20.txt の結果はどうでしょうか? (jsがwshext.dllに関連付けられているかどうか分かりませんが)
757 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:29 ] 710死ね
758 名前:673 mailto:sage [2007/08/03(金) 00:56:35 ] どうやらBOOST_TYPEOFというのがあるらしいですね VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです (しかし本当にtypeofという名前だったとは…^^;) 早速使って見ましたが意図したとおりに動いていい感じ range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、 変数から型の参照が文法の上で自在に行えるのは気持ち良いです >>690 検索かけてみましたが0xではその名前になるようですね Visual C++0x(仮)を楽しみに待ちます
759 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:35 ] bash-3.1$ perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread Binary build 820 [274739] provided by ActiveState www.ActiveState.com (ry bash-3.1$ time perl aozora.pl ../input/20.txt real 0m7.738s user 0m0.015s sys 0m0.031s bash-3.1$ time cscript aozora.js ../input/20.txt Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. real 0m7.637s user 0m0.015s sys 0m0.031s
760 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:43 ] decltype という名前にしたのは、 動的な型は得られないということを分かりやすくしたのかね。
761 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:14:35 ] ちなみに、当方ではどうやってもcscriptかwscriptが起動し、 (aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば 使えるのかは判らずじまい
762 名前:710 mailto:sage [2007/08/03(金) 01:16:13 ] >>759 わざわざ有難うございます。 JScriptは、cscript.exeやwscript.exeに実行させると私のところでも遅いです。 もしWindowsのレジストリ上でjsがwshext.dllに関連付けられている場合は、 >>756 で書いたようにcygstartでaozora.jsを実行してみてください。 私のところでは、詐欺のような速さになっていました。 ともあれ、stdio版なら、PerlやJScriptよりはどうにか速くなる といったところでしょうか。
763 名前:710 mailto:sage [2007/08/03(金) 01:19:46 ] >>761 レスを読んでいませんでした。 自分も特別に何かしたわけではないので、分からない……
764 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:23:06 ] wshext.dllって、実行がexplorerのスレッド内だったりして、 計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、 みたいなオチはないよね?
765 名前:710 mailto:sage [2007/08/03(金) 01:27:50 ] >>764 ……んー。よく考えると、それ以前の問題として、cygstartで起動すると、 すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは ないですね。 失礼しましたm(_ _)m
766 名前:710 mailto:sage [2007/08/03(金) 01:49:44 ] wshext.dllがバカみたいに速いらしいぞ、と勘違いする人がいるかもしれないので 念のため書いておきますが、全くのデタラメでした。 自分も>>755 さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。 jsだけは関連付けで起動させるために、cygstartで実行させていました。 cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。 とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。 が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが 悩ましいですね。 自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない ほどC/C++が優位でしょうけれども。
767 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:15 ] cygwin の GCC って遅かった気がする。 MinGW の方がいい。
768 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:45 ] 勘違いするのはお前くらい
769 名前:710 mailto:sage [2007/08/03(金) 02:09:08 ] >>767 C++のプログラムは全てVC++7.1でコンパイルしました。 cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に ワイド文字の処理には使えないと思います。 (VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは バグがあってダメでした) >>768 そうですね><
770 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:12:39 ] ><
771 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:13:30 ] xlocaleをちょっと弄ったらboost::regexも落ちないようになるらしいけど詳細は忘れた
772 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:18:51 ] そうですね><
773 名前:710 mailto:sage [2007/08/03(金) 02:22:31 ] >>771 xlocaleてことは、boost::regexのバグではなくVC++のバグってことですかね。
774 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:15 ] 勘違いするのはお前くらい
775 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:50 ] ライブラリのバグかコンパイラのバグか知らんけど 動くコンパイラはあるわけだからね
776 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:38:02 ] このスレの>>622 に解決法あるじゃん
777 名前:710 mailto:sage [2007/08/03(金) 02:41:17 ] >>776 あれ、それと同じ問題なのかな? 実はそれを教えていただいた>>616 は自分なんですよ。 ただ、>>616 の場合はxpressiveの正規表現のコンパイル時にスタックが 壊れてSEGVになっていたのですが、 boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、 SEGVではなく、boost::regexが例外をスローしていました。
778 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:49:13 ] じゃあこれかな ttp://capslockabcjp.kitunebi.com/faq.html#boost-bug
779 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:51:50 ] バグってるのはお前くらい
780 名前:710 mailto:sage [2007/08/03(金) 02:54:02 ] >>778 実はそれをboostスレに報告したのも自分なのです。 その正規表現の例を見ればモロバレでしょうが。 随分前にそれで「使い物にならん」と判断して放置していたのですが、 ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。
781 名前:デフォルトの名無しさん [2007/08/03(金) 02:58:01 ] 使い物にならんのはお前くらい
782 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:11:23 ] この流れは酷いな。
783 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:53:07 ] filter.hppってなんじゃらほい
784 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:14:09 ] STLportとかApache C++ Standard Libraryとかはどう?
785 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:39:09 ] script言語はC/C++で書いてある 比較すること自体バカらしい・・・
786 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:52:46 ] cpythonよりIronPythonのが速いっつー話もあるけどな
787 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:58:54 ] class Base{ protected: int a = 0; public: int Test(){ return ++a; } } class Dev : public Base{ public : int Test(){ a += 2; return a; } } int main () { Base * b = new Dev(); printf ( "%d", b->Test() ); } こうやると 1 と表示されます これを2と表示させる(Devクラスの方のTest関数を呼び出す)ことってできないですかね?
788 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:00:09 ] virtual
789 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:13:27 ] お、できました ありがとうございます
790 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:25:50 ] もう一つ質問です Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i]->Test(); } こういうようなことをやっているとループが何回か回った後で メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?
791 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:33:59 ] >>790 つーかそれコンパイル通らないだろ
792 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:35:03 ] Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i].Test(); } こうですた
793 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:40:53 ] 配列をポリモルフィックに扱ってはいけない それをやりたいならポインタの配列とかでやるべき
794 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:00 ] boost::scoped_array<Base> b( new Dev[10] ); for( int i = 0; i < 10; ++i ){ b[i].Test(); } ならおk?
795 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:38 ] >>793 そうなんですか? ポインタの配列というと、下のような感じでいいんでしょうか? Base **b = new Dev*[10]; for( int i = 0; i < 10; ++i ){ b[i] = new Dev(); b[i].Test(); }
796 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:53:33 ] >Base **b = new Dev*[10]; これコンパイル通らないだろ。
797 名前:793 mailto:sage [2007/08/03(金) 23:55:00 ] >>795 ソースはMore Effective C++の第三項。ぜひ一読を
798 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:56:31 ] >>794 同じこと。
799 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:57:42 ] >>795 ねたじゃn
800 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:59:41 ] >>796 Base **b = new Base*[10]; はいけましたが Base **b = new Dev*[10]; はダメみたいです
801 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:12:01 ] ポインタの配列調べてきました、こんなんでいいんですか? malloc久しぶりに使いますた Base **b = (Base**)malloc(10 * sizeof(Dev*)); for( int i = 0; i < 10; ++i ){ b[i] = (Dev*)malloc(10 * sizeof(Dev)); b[i].Test(); }
802 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:13:52 ] >>801 Base やら Dev やらは構造体なの?
803 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:14:46 ] >>802 >>787 のやつです
804 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:16:00 ] mallocじゃコンストラクタが走らないだろう・・ Devを指すBase*の配列を作ればいいと思うよ、多分
805 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:27:19 ] こうか? typedef Base* PBase; std::size_t n = 10; PBase** b = new PBase[n]; for (std::size_t i = 0; i < n; ++i) { b[i] = new Dev; b[i]->Test(); } いい加減boost::ptr_vector使えとか言いたい。
806 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:28:11 ] ptr_vectorはalgorithmが使えないから・・・
807 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:33:47 ] >>806 boost::indirect_iteratorでなんとかなる話?
808 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:39:59 ] 違う、アルゴリズム体操の話。
809 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:20 ] >>807 くやしく
810 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:59 ] なんだあほか
811 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:49:08 ] >>809 www.boost.org/libs/iterator/doc/indirect_iterator.html#example value_typeがT*(一般に*演算子が使える型)なイテレータをラップして value_typeがTであるイテレータにするアダプタ。
812 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:04 ] >>805 さんの方法で上手くいきました、ありがとうございます
813 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:58:29 ] こういうこんがらかるようなソースは嫌い
814 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:03:32 ] こんがりコーン
815 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:04:27 ] 普通に一個一個newすればいいのに
816 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:12:07 ] newが現れた。newが現れた。・・・おや?new達の揚子江が・・・・・!?
817 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:22:39 ] 兆候って言えよ
818 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:30:45 ] template <typename T> void f( typename boost::call_traits<T>::param_type x); みたいな定義で type x; f(x); のようにして使いたいんですが(要はf<type>(x)とかするのがめどい) 何か良いアイデアありませんか?
819 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:53:48 ] template <typename T> void f(T x)ならそのままf(x)できるけどboost::call_traitsってなんだっけ?
820 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:54:11 ] f(x)で呼べるだろ。
821 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:55:27 ] >>819 boost::call_traits<T>::param_typeは、 引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。
822 名前:819 mailto:sage [2007/08/04(土) 12:56:31 ] >>821 だったら>820。
823 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:14:08 ] 普通に考えればそうなるはずなんですが、結果は #include <boost/call_traits.hpp> template <typename T> void f(typename boost::call_traits<T>::param_type) {} int main() { int x; f(x); } error C2783: 'void f(boost::call_traits<T>::param_type)' : テンプレート 引数を 'T' に対して減少できませんでした 'f' の宣言を確認してください。 oops。。。
824 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:24:07 ] コンパイラは何? vc6だとboostの一部は使えないよ。
825 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:40:31 ] 工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工
826 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:42:43 ] VC8です あとGCC3.4でも試してみたが駄目ですた 型推論が上手く行かない為だと思うんですが、これはバグなのか 言語仕様上の限界なのかよくわかりません
827 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:14:16 ] 2.5 というのをファイルから読み込んだんですが、これを小数(Float)に変換するには どうすればいいんでしょうか?
828 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:17:26 ] ↑質問をちょっと訂正です 変換する上で便利な関数はありますか? atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?
829 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:28:47 ] atof(), strtod()
830 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:29:03 ] ありゃまatofなんて関数があったんですね 解決しました