1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.58【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1218023777/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
205 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:15:20 ] 初期のセレロンの1コア2GHzですよ
206 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 22:19:00 ] NetBurst系は他のCPUとはかなり異質な結果が出るらしいからなあ
207 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 23:31:29 ] すみません、初心者な私に教えて下さい。 #include <list> using namespace std; class C { public: int ic; C (int c) { ic = c; } }; int main() { list<C *> mylist; mylist.push_back( new C(0) ); mylist.push_back( new C(1) ); mylist.push_back( new C(2) ); } こんな感じになってるとして、ic == 1 であるようなオブジェクトだけを、 ・list から削除し、 ・かつ delete する には、どのように書けばよいのでしょう。
208 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:32:06 ] #include <iostream> #include <list> #include <algorithm> using namespace std; class C { public: int ic; C (int c) { ic = c; } ~C() { cout << "~C" << endl; } }; struct delete_equal_to: public std::binary_function<C *, int, bool> { bool operator ()(C * p, int c) const { return (NULL != auto_ptr<C>(p->ic == c ? p: NULL).get()); } }; int main() { list<C *> mylist; mylist.push_back( new C(0) ); mylist.push_back( new C(1) ); mylist.push_back( new C(2) ); cout << mylist.size() << endl; mylist.remove_if(bind2nd(delete_equal_to(), 1)); cout << mylist.size() << endl; }
209 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:41:07 ] >>208 returnの中はp->ic == cだとだめなの?って書こうとしたが、deleteさせる意図があるのね。 そこまでするくらいなら、list<shared_ptr<C> >使えよって言ってやるべきだと思う。
210 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:45:31 ] 「まだ」C++標準ではないのでね。
211 名前:207 mailto:sage [2008/09/14(日) 00:57:04 ] ぐっは、難しい…。 もしかしてさらっと書ける構文とかあるのかと思ったら、そうでも無いのですね。 でも一つずつ読解してみます。 ありがとうございました!
212 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 00:59:34 ] ついでに言っておくけど mylist.push_back( new C(0) ); はpush_backに失敗するとnew C(0)したオブジェクトがリークする
213 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:15:33 ] 馬鹿な私に教えて下さい。 宿題板で、作って頂いたc++なのですが習ってない部分も出ていて、 よくわからず、困っています。 習っていない関数を使うのには、特に問題はないのですが 提出の際に説明書っぽいのをつけるのですが作成できず困っています。 例えば、この作業をするには?とか、オプションでこんな事も出来ます とかです。 スレチかもしれませんが、宜しくお願いします。 ちなみに、宿題板ではボロボロに言われ、ここにきました。 すいません。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7720.txt
214 名前:207 mailto:sage [2008/09/14(日) 01:18:29 ] なるほど…。 ということは、push_back() の引数として直接与えるんじゃなくて、 いったん C *p = new C(0); して、とりあえず mylist.push_back( p ); としてみて、 std::bad_alloc が投げられたらあきらめて delete する、 みたいな感じでしょうか。
215 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:22:08 ] >>213 そんなの一から読めって言うのかよ。 大まかな機能ぐらい説明しろよ。 お前が作らせたんなら分かるだろうが。 というか、宿題スレ池。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/
216 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:29:56 ] >>215 わかりました。宿題スレに行きます。 すいませんでした。ご迷惑お掛けしました。 ちなみに、内容はエンコドとデコドで テキストを吐き出し、オプションでプリントするみたいな感じです。 失礼しました。
217 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:33:41 ] 見たけどコメントついてるじゃん 無理せずに単位落としたら?
218 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 01:36:08 ] >>214 bad_allocが投げられたらdeleteする必要はないぞ。
219 名前:207 mailto:sage [2008/09/14(日) 01:42:05 ] >>218 了解しました。 どうもありがとうございます。
220 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 02:24:00 ] >>218 お前は読み間違えてる
221 名前:207 mailto:sage [2008/09/14(日) 02:29:02 ] >>220 あ、やっぱ delete(p); は必要ですか。 ていうか私が言葉足らずでした。
222 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:02:24 ] std::bad_alloc例外が投げられるという事はメモリ確保に 失敗しているのだから、deleteしたらまずいだろう
223 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:37:51 ] こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。 C *p = new C(0); try { mylist.push_back(p); } catch (std::bad_alloc const&) { delete p; throw; } auto_ptrでもいける。 std::auto_ptr<C> p(new C(0)); mylist.push_back(p.get()); p.release();
224 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 03:54:17 ] >>223 ああそういう意味かごめん そりゃdeleteは必要だわ newとpush_backを分離する事を前提とした 話なのね
225 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:23:11 ] >>207 さらっと、というか自分でループまわす構文はあるよ。 STL的ではないけど。 for(list<C *>::iterator it=mylist.begin(); it != mylist.end();) { // 1なら if((*it)->ic == 1) { delete *it; it= mylist.erase(it); } // 1じゃないなら else { ++it; } }
226 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 06:53:47 ] 確かboostだとこう書ける #include <boost/ptr_container/ptr_list.hpp> typedef boost::ptr_vector<C> list_type; //ポインタ指定しないが、中身はポインタになる list_type mylist; mylist.push_back( new C(0) ); 〜 for(list_type::iterator it = mylist.begin(); it != mylist.end();) { if(it->ic == 1) { it = mylist.erase(it); //消去動作で自動でdeleteされる } 〜 //あとは225と一緒 詳細 ttp://www.kmonos.net/alang/boost/classes/pointer_container.html
227 名前:207 mailto:sage [2008/09/14(日) 10:05:26 ] >>223 > こういうことだろ。bad_allocを投げるのはmylist、pはdeleteしないといけない。 あ、そうです。言葉足らずというのはそれが言いたかったのでした。 >>225 おおお、これです。こんな感じのを期待していました! > STL的ではないけど。 というのは、イテレーションしていく過程はあくまでイテレータにまかせるべきで、 「it= mylist.erase(it);」のような「つなぎかえ」(?)のようなことを外野がやるのは スマートじゃない、ということでしょうか。 うーむ、「実行時に動的に new したものを連結させておき、いらなくなったらそこだけ外す」 というのは良くあるケースかと思っていたのですが、もしかしてそもそもデータ構造の 選び方が間違ってますか……? >>224 氏も、 > newとpush_backを分離する事を前提とした > 話なのね とおっしゃってるし……。 >>226 いろいろな環境で動かしたいのでできれば boost は避けたいのですが、 でも勉強になります。特にリンク先の「etc」のところ。 ありがとうございます。
228 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:03:52 ] >>227 boostって静的リンク(?)だから大丈夫じゃないの?
229 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 16:44:57 ] ファイル分割+テンプレートの特殊化で悩んでいます。 Test.h(Testクラス ヘッダファイル) Test.cpp(Testクラス コンストラクタ) show.cpp(Test<T>::show() 関数) show1.cpp(Test<Test<int>>::show() show()のテンプレート特殊化) で構成されています。 show.cppにあるTest<T>::show()を アップしたファイルのように書き換えるとコンパイルエラーが発生してしまい、 これを解決できません。 よろしくお願いします。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7722.txt
230 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 17:58:13 ] Test.hのtemplate <typename T>class Testのメンバ関数として friend ostream &operator << (ostream &str, T const &val) { return str << val ; } C++はあまり使ったことはないけど、これでも追加するといいかも エロいひとの解答待つか
231 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:12:39 ] >>225 list だと、こうじゃなかったっけ? ごめん。調べないで書いてる。 for (list<C *>::iterator it = mylist.begin(); it != mylist.end();) { if ((*it)->ic == 1) { delete *it; mylist.erase(it++); } else { ++it; } }
232 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:37:02 ] erase したイテレータを++するのは未定義動作じゃなかったか?
233 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 18:45:29 ] >>232 mylist.erase(it++); はイテレータを進めてから、進める前のイテラータに対してeraseするから問題ないと思うよ。 listのeraseでは消したイテレータ以外は無効にならないから。
234 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:04:13 ] 戻り値が次の要素じゃなかったっけ? it = mylist.erase(it);
235 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 21:41:25 ] listなら++でも安全だとしても、別なコンテナに変えられる可能性も 考慮して、戻りを代入するべきでは。
236 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:10:33 ] >>235 set,multissetとかだとeraseの戻り値の型がvoidだったりするから、 it == hoge.eraseが書けないときもある。 vectorならeraseの戻り値を使えても、別なコンテナに変えられる可能性も 考慮してit++にするべきでは。
237 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 22:53:20 ] >>236 vectorならit++は使えない。
238 名前:229 [2008/09/14(日) 22:53:23 ] >>230 ありがとうございます。 <<のオーバーロードで修正がベスト何ですかね。
239 名前:デフォルトの名無しさん mailto:sage [2008/09/14(日) 23:26:15 ] vectorの場合remove_ifして得た新しい末尾以降をそれぞれdeleteした後にerase(new_end, end) とlistとはやりかたが違うから、差し替え考慮するのは無理があるんでない?
240 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 02:15:17 ] vectorとdequeはeraseの後反復子が無効化されるので、eraseの戻り値が必要。 mapやsetはeraseの戻り値がvoidなので、it++するしかない。 シーケンスコンテナと連想コンテナの取り替えを想定するのは 無理があるって事だな。
241 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 09:14:33 ] effective STL に同じような話がある
242 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:28:05 ] Visual C++ 2008 Express Editionでコンパイルした実行ファイルを、VC++が入ってないPCではエラーが出て実行できないんですけど VC++が入ってないPCでも実行する方法を教えてください。
243 名前:207 mailto:sage [2008/09/15(月) 10:29:22 ] >>225 氏の方法でも >>231 氏の方法でもうまくいきました。 ありがとうございます。 「別なコンテナに変える」ということの意味はまだ良くわからないので、 引き続き勉強します。 >>241 > effective STL に同じような話がある なるほど、早速ポチりました。
244 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:47:02 ] >>242 エラーが出ないように修正する
245 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:53:17 ] >>244 VC++がインストールされているPCではエラーがなく実行できます。
246 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:54:07 ] >>242 まずはエラーの内容を示さないと・・・・ MFC7のdllがないとかか。
247 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 10:59:51 ] SideBySide絡みじゃ? MSから再配布可能なんちゃらを実行するPCにインストールすればいいとおも
248 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:49:58 ] >>246 ほかのパソコンで実行すると指定したプログラムは実行できません。と表示されます。
249 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:52:21 ] 何で初心者って「エラーが出ます」「うまくいきません」 「動きません」って言って具体的なこと書かないんだろうな。
250 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:53:18 ] >>248 本当にメッセージそれだけ?
251 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:57:28 ] >>250 今はほかのパソコンにもVC++を入れてしまっているので確認はできないんですけど、もう少し長かったような気がします。 VC++を入れてない人のパソコンでも何かインストールをしなくても普通のアプリケーションみたいに実行できるようにしたいんです。
252 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:01:39 ] >>251 1. VC++のバージョンにあうランタイムライブラリをインストールさせる。 www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ja www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ja 2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。
253 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:22:30 ] >>251 基本的によく分からないエラーが出たら、 スクリーンショットを撮る事。 そのプログラムのプロジェクトプロパティの 共通言語ランタイムサポートが「使用しない」以外なら .NET Framework Runtime をインストールする必要がある。 MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。 構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。
254 名前:242 mailto:sage [2008/09/15(月) 12:26:45 ] 調べたらDebugフォルダの中の実行ファイルをただほかのPCに移動するだけでは、駄目らしいということがわかりました。 ソリューション構成をReleaseにしてコンパイルしたものを、ほかのPCに移動して実行すればいいんでしょうか。 今はそばにVC++が入ってないPCがないので確認ができないんですけど、それでいいのでしょうか。 >>253 今はエラーを確認できないのでスクリーンショットも撮れません。
255 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:30:06 ] pow DOMAIN errorのメッセージダイアログを出ないようにするにはどうすればいいですか
256 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:31:07 ] >>254 >それでいいのでしょうか。 お前、>>252-253 を読んだ上で言ってるの?
257 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:00 ] STLSOFTが良さそう 日本語の解説すくない だれか教えて。 Windowsに限ればboostよりいい気がしてる。 www.stlsoft.org STLSoftの中身 ACESTL (acestl.org ). ATLSTL (atlstl.org ). COMSTL (comstl.org ). .netSTL (dotnetstl.org ). InetSTL (inetstl.org ). MFCSTL (mfcstl.org ). UNIXSTL (unixstl.org ) WinSTL (winstl.org ). もうなんだか至れり尽せりですね。 自分がやっているプロジェクトの意味が無いように思えてきた・・・。おrz!!! d.hatena.ne.jp/studiokingyo/20061223
258 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:51:32 ] >>255 どういうソースで出るんだ?
259 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:53:36 ] >>252 できればほかのパソコンに何かインストールする方法は避けたいです。 >2. msvcr90.dllなどをMicrosoft.VC90.CRT.manifestなどと共にEXEと同じフォルダに置く。 よくわかりませんでした。もう少し詳しく教えてください。 >>253 共通言語ランタイムサポートを使用しないになっています。 >MFCの使用が「共有DLLで〜」なら「スタティックライブラリで〜」に。 > >構成プロパティ - C/C++のランタイムライブラリが「/MD」なら「/MT」に。 この設定でコンパイルすると 1>MSVCRT.lib(wcrtexew.obj) : error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 ___tmainCRTStartup で参照されました。 1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\Othello\Debug\Othello.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と、なってコンパイルできません。 >>256 調べてる間にレスがきてしまったので失礼しました。
260 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 12:55:16 ] >>257 自分で翻訳なり、ソース解析なり出来ないなら諦めた方が良い 問題が起きたとき、自力で解決出来んだろう
261 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:02 ] >>259 main() で始まるコンソールプログラムなのに コンソールプロジェクトになっていないんじゃ・・・ WinMain() で始まる windows プログラムなのに、 そのエラーとなると tchar.h あたりの UNICODE 関連が怪しい
262 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:02:51 ] >>259 「/MDd」を「/MT」にしてないか? 「/MDd」なら「/MTd」だぞ。MD→MTなんだから。 あとプロジェクトプロパティの左上に構成ってあるだろ。 デバッグ版とリリース版で設定が分かれてるから、それぞれ設定を変えること。 まぁ、リリース版だけでも良いと思うけど。
263 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 13:06:10 ] >>261 忘れて。 オプション変えたらリンク通らなくなっただけじゃ違うわ
264 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:03:24 ] 2chでスレたてて盛り上げていこうぜ > STLport 日本語の解説サイトも作る
265 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:04:29 ] STLport > STLsoft ね。
266 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:29:55 ] >>258 こんな感じだそうです。 pow()は底 の乗数 乗の計算を行って返す関数である。底 がゼロで乗数 がゼロ以下の場合にはdomain errorが発生する。また、底 が負で乗数 が小数の場合にもdomain errorになる。計算結果がオーバーフローする場合はrange errorが発生する。
267 名前:266 mailto:sage [2008/09/15(月) 14:30:56 ] 追記:その状態になってもダイアログを出したくないのです
268 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 14:54:55 ] double d; d = pow(0.0, -2.1); std::cout << d << std::endl; d = pow(-2.1, 0.1); std::cout << d << std::endl; d = pow(10e10, 100); std::cout << d << std::endl; --------------- 1.#INF -1.#IND 1.#INF 再現出来ないな。何が違うんだろう。
269 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 15:01:17 ] ウィンドウプロジェクトにするとなります。
270 名前:デフォルトの名無しさん [2008/09/15(月) 16:19:19 ] stlの質問です。 下記のプログラムを実行するとhoge関数が呼ばれて戻ってきた時には、TESTメンバのstrの領域はデストラクタで、 解放されてしまってます。この場合は、main()の最後でlistのstrを解放するしかないのでしょうか? もっと別のやり方があれば教えて下さい。宜しくお願いします。 #include <string> #include <list> struct TEST { std::string *str; TEST() : str(NULL) {} ~TEST() { delete[] str; } }; void hoge(std::list<TEST> &list) { TEST test; test.str = new std::string[10]; list.push_back(test); } int main() { std::list<TEST> list; hoge(list); // list.str不適切なポインタ return 0; }
271 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:02:15 ] C++で数値計算を行なっていて、 計算結果を1ステップごとにfstream使ってファイルhoge.txtに出力していました。 上記とは一切関係ない部分のバグを取って再度実行したら、 ファイルへの出力が途中からされなくなってしまいました。 1000回計算するとしたら380回から出力されません。ただ、coutではきちんと値が表示されます。 出力されなくなった後もプ゚ログラム自体は動き続けているためエラーが出ず、原因がわかりません。 このような症状の場合、どのような原因が考えられるか教えていただけませんか?
272 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:12:59 ] ・ストレージの空き容量が不足している。
273 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:20:56 ] ・ストリームをフラッシュしていない(勿論、クローズしていない)。
274 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:12 ] そんなわけ・・・・マジだ、吊ってきます orz エラーを出す方法とかありますか?
275 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:23:27 ] 380回のあたりで異常な文字列を吐いてしまって fstreamがエラー状態になっているとか。
276 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:24:33 ] >>270 TESTにきちんとコピーコンストラクタとoperator =を設ける。
277 名前:271 mailto:sage [2008/09/15(月) 17:25:52 ] >>274 は>>272 に対してのレスです。 申し訳ない
278 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 17:34:40 ] of.exceptions(badbit| failbit)としておけば、例外投げてくれる。 例外が嫌なら書き込み後にof.bad()とかof.fail()とか見ればいい。
279 名前:242 mailto:sage [2008/09/15(月) 17:40:36 ] ソリューション構成をReleaseにしてみたら知り合いに送ったところ実行できたそうです。 皆様ありがとうございます。
280 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 18:53:59 ] >>270 ポインタのメンバをディープコピーするTESTのコピーコンストラクタをきちんと書くこと。
281 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:20:58 ] このプログラムで値が変わるのはなぜですか? main(){ char a[]="マルチバイト文字列 mbs の sz 文字分をワイド文字列に変換します。"; wchar_t b[300]; cout<<strlen(a)<<endl; MultiByteToWideChar(CP_ACP, 0, a, n, b, 300); cout<<wcslen(b)<<endl; }
282 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:28:54 ] 自己解決しました
283 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:46:12 ] 自己解決しませんでした。 値が変わります? なぜですか? int m,n; char a[]="マル"; wchar_t b[300]; n=strlen(a); mbstowcs(b,a,n); m=wcslen(b); wcstombs(a,b,m); cout<<n<<" "<<m<<" "<<strlen(a)<<endl;
284 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 00:50:03 ] 自己解決しました
285 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:08:59 ] chatとw_charの変換はWindows APIのほうが鈍いようです。 #include <windows.h> #include <time.h> #include <iostream> using namespace std; main(){ int m,n,r,k; char a[500]="マクロの動作は、有効になっているコンパイラ ディレクティブによって異なる。変換元と変換先の型が同じ場合は変換は行われない。コンパイラ ディレクティブでは、T および OLE を次のように変換する。"; wchar_t b[500]; n=strlen(a); mbstowcs(b,a,n+1); m=wcslen(b); wcstombs(a,b,m+1); int cl=clock(); for(k=0;k<1000000;k++){ r=MultiByteToWideChar(CP_ACP, 0, a, n, b, 500); b[r]=0; r=WideCharToMultiByte(CP_ACP, 0, b, m, a, 500, NULL, NULL ); a[r]=0;} cl=clock()-cl; cout<<cl<<endl; for(k=0;k<1000000;k++){ mbstowcs(b,a,n+1); wcstombs(a,b,m+1);} cl=clock()-cl; cout<<cl<<endl;}
286 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:34:51 ] MultiByteToWideCharの使い方が間違っているからです
287 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 01:44:31 ] 正しい使い方はどうすればできますか
288 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 10:03:56 ] MSDNをよく読む
289 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:28:05 ] サイズが決まっていないchar*型の文字列が10個ていどあって 一致する文字が存在するか見つける高速な方法はSTLのmapですか。 一番速い方法教えてください。 あと元データは削除、追加可能でお願いします。
290 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 12:32:39 ] Double-Arrayていうのがありますが、単語数は少ないので、そんな最新技術はいらないし、速く見つかる方法がいいです。 Double-Array は Trie を表現するためのデータ構造です. ハッシュ木, デジタルトライ, パトリシア木, Suffix Array による 擬似 Trieといった 他の Trie の実装に比べ高速に動作します. オリジナル の Double-Arrayは, 動的に key の追加削除を行えるような枠組ですが, Darts は ソート済の辞書を一括してDouble-Array に変換することに機能を絞っています. chasen.org/~taku/software/darts/
291 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 15:49:12 ] hashmapはそれほど速くないです。 #include <windows.h> #include <iostream> #include <map> #include <hash_map> #include <string> #include <vector> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);} int n=0; string searchword(strgen()); #define N 500000 // 空のループ cl=timeGetTime();for(i = 0; i < N; i++) ;cl=timeGetTime()-cl; cout<<cl<<endl; // STLmap cl=timeGetTime(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl; // STLport_hashmap cl=timeGetTime(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=timeGetTime()-cl; cout<<cl<<endl; // Vector cl=timeGetTime(); for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; cl=timeGetTime()-cl; cout<<cl<<endl;}
292 名前:十分速いじゃん… mailto:sage [2008/09/16(火) 16:25:57 ] #include <iostream> #include <map> #include <stlport/hash_map> #include <string> #include <vector> #include <boost/progress.hpp> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; vector<string> vec; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++) str+=(char)(97+rand()%3); return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 100; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);vec.push_back(p.first);} #define BEGIN { boost::progress_timer t; #define END } int n=0; string searchword(strgen()); #define N 500000 BEGIN;for(i = 0; i < N; i++) ;END; // 空のループ BEGIN; for(i = 0; i < N; i++) stlmap.find(searchword); END; // STLmap BEGIN; for(i = 0; i < N; i++) hashmap.find(searchword); END; // STLport_hashmap BEGIN; // Vector for(i = 0; i < N; i++)for(int j=0;j<vec.size();j++)if(vec[j]==searchword)break; END;} g++ hashmap.cxx -I /usr/include/stlport/ -lstlport -O2 % ./a.out |tr "\n" " " 0.00 s 0.66 s 0.17 s 4.95 s
293 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 16:35:30 ] 訂正: -O2 -> -O0
294 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:15:34 ] unordred_mapのがいいよ多分
295 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 17:35:55 ] unordred_mapきはなかなかですね。 #include <iostream> #include <map> #include <hash_map> #include <string> #include <vector> #include <unordered_map> #include <time.h> using namespace std; map<string,int> stlmap; hash_map<string,int> hashmap; tr1::unordered_map<string,int> unorderedmap; string strgen(){ int R=10+rand()%10; string str=""; for(int j = 0; j < R; j++){int r=rand(); str+=(char)(97+r&3)+(char)(97+(r>>2 )&3);} return str; } int main() { int i,cl; pair<string,int> p; for(i = 0; i < 10000; i++) { p = make_pair(strgen(),i); stlmap.insert(p);hashmap.insert(p);unorderedmap.insert(p);} int n=0; string searchword(strgen()); #define N 500000 // 空のループ cl=clock();for(i = 0; i < N; i++) ;cl=clock()-cl; cout<<cl<<endl; // STLmap cl=clock(); for(i = 0; i < N; i++) stlmap.find(searchword); cl=clock()-cl; cout<<cl<<endl; // STLport_hashmap cl=clock(); for(i = 0; i < N; i++) hashmap.find(searchword); cl=clock()-cl; cout<<cl<<endl; //unorderedmap cl=clock(); for(i = 0; i < N; i++) unorderedmap.find(searchword); cl=clock()-cl; cout<<cl<<endl;}
296 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:02:46 ] GoogleCode sparse_hash_map GoogleCode dense_hash_mapのインストール方法が判りません。 教えてください。 ここのコードがコンパイルしたいです。 BCC2009かVC++2008のやり方判りたいです。 articles.blog79.fc2.com/blog-entry-25.html
297 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 18:16:27 ] なんにもいれずにそのコードを実行しようとしてるようなレベルですか?
298 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 19:07:44 ] VC2008のhash_mapはstdext名前空間に入ってるのか コンパイルできずにしばらく悩んだ それにしてもDinkumwareは遅い・・・
299 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:05:05 ] >>298 SP1当てればstd::tr1::unordered_mapも使えるよ。 もちろん性能は変わらないだろうけど。
300 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:59:36 ] ある変数に連動して、複数のvectorのサイズを変更できますか? 自分で増減させると面倒です。
301 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:02:40 ] 自己解決しました。 tasu(); hiku(); という関数を作ってそこで処理することにしました。
302 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:13:45 ] 関数って良いよね…… 造形が凄くソソるよね……
303 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:19:27 ] free(normal) functionより major(static) function objectの方がそそります^q^
304 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 00:34:32 ] もっと俗っぽくresult_ofよりdecltypeのほうが欲しいな
305 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 02:44:47 ] a,b,c・・・は0に近い値とし、x,y,z・・・は自然数とします。 このとき、(1+a)^x (1+b)^y (1+c)^z ・・・・の(x+y+z+・・・)乗根を求めたいです。 どのように計算するのが速いでしょうか? 100項目程度あるとします。